Può int (*)[]
essere un tipo incompleto?
C 2018 6.2.5 1 dice:
In vari punti all'interno di un'unità di traduzione un tipo di oggetto può essere incompleto (privo di informazioni sufficienti per determinare la dimensione degli oggetti di quel tipo) o completo (con informazioni sufficienti).
Quindi sembra che se la dimensione di un tipo è nota, il tipo è completo. 6.2.6.1 28 specifica che determinati tipi di puntatori devono avere le stesse dimensioni (puntatori void
e caratteri, puntatori a tipi compatibili, puntatori a strutture e puntatori a sindacati), ma i puntatori ad altri tipi possono variare.
In un'implementazione C in cui tutti i puntatori o tutti i puntatori a matrici int
hanno le stesse dimensioni, allora la dimensione di int (*)[]
è nota, quindi sarebbe completa. In un'implementazione che, ad esempio, utilizza diversi puntatori per array di grandi dimensioni, la dimensione non sarebbe nota, quindi è incompleta.
Come sottolinea MM , una struttura non deve contenere un membro di tipo incompleto, ad eccezione di un membro dell'array flessibile finale, per un vincolo del 6.7.2.1 3. Ciò suggerisce che un'implementazione con una dimensione di puntatori deve accettare struct { int (*p)[]; }
mentre un'implementazione che ha differenti le dimensioni di tali array devono diagnosticare una violazione del vincolo. (Ciò a sua volta significa che una tale dichiarazione non fa parte della C. rigorosamente conforme)
void *
sia completo mostra che un puntatore a un tipo incompleto può essere completo. Non mostra se un puntatore a un tipo incompleto può essere incompleto. Se uno si chiedesse "Può un mammifero essere un elefante?", Mostrando che "Un leone è un mammifero" non fornirebbe che un mammifero non può essere un elefante. La domanda si chiede se l'insieme X di puntatori di tipo incompleto possa contenere un elemento incompleto. Mostrare che l'insieme X di puntatori al tipo incompleto contiene un elemento completo è irrilevante.