2010-03-03 15 views
5

¿podemos declarar una función en un archivo de encabezado de la siguiente manera?declaración de función C

extern int ap(char[][]); 

podemos usar char [] [] en la función?

+8

por qué no lo intentas y lo averiguas. –

+2

@darren: "Probarlo" rara vez es la manera correcta de probar la validez de una construcción de lenguaje. Hay suficientes víctimas de "funciona en GCC" (por ejemplo). – AnT

Respuesta

5

Para una matriz bidimensional, debe proporcionar un tamaño para la última dimensión, de lo contrario, el compilador no sabe cómo usarlo. (Que está bien para omitir el nombre embargo.)

así:

extern int ap(char[][10]); 
1

Sin embargo, es perfectamente válido omitir nombres de parámetros en declaraciones de funciones. Cuando define la función, sin embargo, debe darle un nombre a la matriz, y luego puede referirse a ella con este nombre.

7

No, es necesario que especifique los últimos N-1 Dimensiones de una matriz.

extern int ap(char[][DIMENSION]); 

Para más información lee here

1

No, esto no está permitido - se trata de declarar el parámetro como un puntero a un tipo de matriz incompleta.

El tipo de matriz debe ser completado con un tamaño, como esto:

extern int ap(char[][10]); 
4

char[][] no es un tipo de matriz válida porque no se puede tener matrices de un tipo incompleto, y char[] es incompleta. Sé que es confuso porque realmente tiene dos tipos de matriz, así que aquí hay otro ejemplo con el mismo problema: char a[3][]. La matriz a tiene longitud 3 y tipo de elemento de char[], pero char[] está, de nuevo, incompleto y es invalid.

Cuando tiene una "matriz multidimensional", realmente tiene una matriz de matrices. Por ejemplo, typedef int U[3][5]; hace U una matriz de longitud 3 de matrices de longitud 5 de ints y es equivalente a typedef int H[5]; typedef H U[3];.

La razón puede omitir la dimensión más a la izquierda con los parámetros de función se debe a que, con los parámetros de función única, tipos de matriz de la forma T[N] se transforman en T* y N se puede omitir, dando T[] a T*. Esto solo se aplica al nivel "más alto" o "más externo".

Por lo tanto, todas estas declaraciones de funciones son idénticas:

int f1(int a[3][5]); 
int f2(int a[][5]); 
int f3(int (*a)[5]); 
typedef int T[5]; 
int f4(T a[3]); 
int f5(T a[]); 
int f6(T* a); 

Usted puede, por supuesto, eliminar el nombre del parámetro un en cualquiera de las declaraciones anteriores sin cambiarlos.

Cuestiones relacionadas