2010-03-03 16 views
5

possiamo dichiarare una funzione in un file di intestazione nel modo seguente?Dichiarazione di funzione C

extern int ap(char[][]); 

possiamo usare char [] [] in funzione?

+8

perché non provarlo e scoprirlo. –

+2

@darren: "Trying it" è molto raramente il modo giusto per verificare la validità di un controlo linguistico. Ci sono abbastanza vittime di "funziona in GCC" là fuori (per un esempio). – AnT

risposta

5

Per un array bidimensionale, è necessario fornire una dimensione per l'ultima dimensione altrimenti il ​​compilatore non sa come usarlo. (Va bene di omettere il nome però.)

come questo:

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

Tuttavia, è perfettamente valido omettere i nomi dei parametri nelle dichiarazioni di funzione. Quando si imposta la funzione , tuttavia, è necessario assegnare un nome all'array e quindi è possibile fare riferimento a tale nome.

7

No, è necessario specificare gli ultimi N-1 dimensioni per un array.

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

Per ulteriori informazioni consultare here

1

No, questo non è consentito - tenta di dichiarare il parametro come un puntatore a un tipo di matrice incompleta.

Il tipo di matrice deve essere completato con una dimensione, come questo:

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

char[][] non è un tipo di matrice valida perché non si può avere array di un tipo incompleto, e char[] è incompleto. So che è confuso perché hai davvero due tipi di array, quindi ecco un altro esempio con lo stesso problema: char a[3][]. L'array a ha lunghezza 3 e tipo di elemento char[], ma char[] è, ancora, incompleto e questo è invalid.

Quando si dispone di un "array multidimentale", si dispone di una serie di array. Ad esempio, typedef int U[3][5]; rende U un array di lunghezza 3 di array di lunghezza 5 di ints ed è equivalente a typedef int H[5]; typedef H U[3];.

Il motivo è possibile omettere la dimensione più a sinistra con parametri di funzionamento è perché, con parametri di funzionamento solo, tipi di matrice della forma T[N] si trasformano in T* e N può essere omesso, dando T[] a T*. Questo si applica solo al livello "più alto" o "più esterno".

Quindi, tutte queste dichiarazioni di funzione sono identiche:

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); 

È possibile, ovviamente, eliminare il nome del parametro un in una delle dichiarazioni di cui sopra senza modificarli.

Problemi correlati