new for devolver create array c arrays parameters static

for - ¿Cuál es el propósito de la palabra clave static en el parámetro array de la función como "char s[static 10]"?



load array c (1)

Mientras navegaba por un código fuente, encontré una función como esta:

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

Con algo de experimentación, parece que también pueden aparecer otros calificadores allí:

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

Parece que los calificadores solo están permitidos dentro de [ ] cuando la matriz se declara como un parámetro de una función. ¿Qué hacen estos? ¿Por qué es diferente para los parámetros de función?


La primera declaración le dice al compilador que someArray tiene al menos 100 elementos de longitud. Esto puede usarse para optimizaciones. Por ejemplo, también significa que someArray nunca es NULL.

Tenga en cuenta que el Estándar C no requiere que el compilador diagnostique cuando una llamada a la función no cumple con estos requisitos (es decir, es un comportamiento silencioso e indefinido).

La segunda declaración simplemente declara algunos someArray (¡no someArray elementos de someArray !) Como const, es decir, no se puede escribir someArray=someOtherArray . Es lo mismo que si el parámetro fuera char * const someArray .

Esta sintaxis solo se puede utilizar dentro del [] más interno de un declarador de matriz en una lista de parámetros de función, no tendría sentido en otros contextos.

El texto estándar, que abarca ambos casos anteriores, se encuentra en C11 6.7.6.3/7 (fue 6.7.5.3/7 en C99):

Una declaración de un parámetro como '''' matriz de tipo '''' se ajustará a '''' puntero calificado para escribir '''', donde los calificadores de tipo (si los hay) son los especificados dentro de [ y ] de la derivación de tipo de matriz. Si la palabra clave estática también aparece dentro de [ y ] de la derivación del tipo de matriz, entonces para cada llamada a la función, el valor del argumento real correspondiente proporcionará acceso al primer elemento de una matriz con al menos tantos elementos como se especifique por la expresión de tamaño.