Qual è lo scopo della parola chiave static nel parametro array della funzione come "char s [static 10]"?


144

Durante la navigazione del codice sorgente mi sono imbattuto in una funzione come questa:

void someFunction(char someArray[static 100])
{
    // do something cool here
}

Con un po 'di sperimentazione sembra che anche altri qualificatori possano apparire lì:

void someFunction(char someArray[const])
{
    // do something cool here
}

Sembra che i qualificatori siano consentiti solo all'interno [ ]dell'array quando l'array viene dichiarato come parametro di una funzione. Cosa fanno questi? Perché è diverso per i parametri delle funzioni?

Risposte:


127

La prima dichiarazione indica al compilatore che someArrayè lungo almeno 100 elementi. Questo può essere usato per le ottimizzazioni. Ad esempio, significa anche che someArraynon lo è mai NULL.

Si noti che lo standard C non richiede al compilatore di diagnosticare quando una chiamata alla funzione non soddisfa questi requisiti (vale a dire, si tratta di un comportamento non definito non definito).

La seconda dichiarazione dichiara semplicemente someArray(non someArraygli elementi!) Come const, cioè non è possibile scrivere someArray=someOtherArray. È lo stesso che se il parametro fosse char * const someArray.

Questa sintassi è utilizzabile solo all'interno [] di un dichiaratore di array in un elenco di parametri di funzione; non avrebbe senso in altri contesti.

Il testo standard, che copre entrambi i casi di cui sopra, è in C11 6.7.6.3/7 (era 6.7.5.3/7 in C99):

Una dichiarazione di un parametro come '' array di tipo '' è regolata per '' puntatore per assegnare il tipo '', dove le qualificazioni tipo (se presenti) sono quelli indicati nella [e ]del tipo di matrice derivazione. Se la parola chiave static appare anche all'interno [e ]della derivazione del tipo di array, quindi per ogni chiamata alla funzione, il valore dell'argomento effettivo corrispondente fornisce l'accesso al primo elemento di un array con almeno tanti elementi come specificato dal espressione dimensionale.


35
Su questo argomento: mi chiedo se debba essere considerato preferibile usare int foo(struct bar [static 1]);invece che int foo(struct bar *);come firma per le funzioni che non accettano i puntatori NULL. (So ​​che gcc ha una sintassi alternativa non standard per contrassegnare tali funzioni in modo che il compilatore possa dare avvisi ..)
R .. GitHub FERMA AIUTANDO ICE

2
Ho appena controllato gcc e clang e nessuno dei due presume che someArray sia sempre non nullo quando chiedo loro di confrontare con 0. Inoltre faccio fatica a trovare la clausola esatta in C99 che lo definisce. C'è una nota in 6.7.5.3-21 che menziona il significato voluto e basta. Dubito che possiamo contare su questo. Inoltre, tutto ciò non fa parte della firma della funzione, quindi non c'è molto che applichiamo attraverso di essa.
Mainframe nordico

5
Quel collegamento sembra essere marcito, è questo a cosa puntava? pic.dhe.ibm.com/infocenter/zos/v1r12/…
Ross Aiken,

13
@NordicMainframe: è passato del tempo, ma la versione attuale di clangora avvisa correttamente quando si tenta di passare un argomento noto-NULL a una funzione con una [static 1]dichiarazione di parametro.
dreamlax,

1
@CiroSantilli 巴拿馬 文件 六四 事件 法轮功if (!someArray) { somecode... }potrebbe essere rimosso
MM
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.