2012-02-08 9 views
8

Ho molti sensori a 3 assi diversi per cui sto scrivendo il codice di prova. Nei file C per ciascuno di essi, ho la stessa stringa char definito:Come definire una matrice di stringhe di caratteri nel file di intestazione?

char axis[3][8] = {"X", "Y", "Z"} 

che uso quando ho "per" i risultati del ciclo di stampare l'asse che non riesce in questo modo:

DEVICETEST_LOG("%s Failed %s axis for Min range\n",device_name[DUT], axis[i]); 

Stavo pensando di risparmiare spazio potrei definire un array di stringhe di caratteri in un file di intestazione da usare dappertutto.

Ho provato un certo numero di cose, ma non riesco a ottenere un array di stringhe definito nel mio file di intestazione che posso scorrere per passare una compilazione.

risposta

10

Al fine di evitare errori del linker, è necessario dichiarare la matrice come extern in un file di intestazione, e quindi definire la matrice volta in uno dei vostri moduli di codice.

Così, per esempio:

//myheader.h 
extern const char* axis[3]; 

poi in un altro modulo di codice da qualche parte:

//myfile.c 
const char* axis[3] = { "X", "Y", "Z" }; 
+0

ah che ha senso, ma sembra bassackwards ... Quindi il file di intestazione che includo ovunque punta tutti gli altri file C alla definizione locale "myfile.c". – user1054210

+0

Quindi, anche se ho incluso il file di intestazione negli altri file c, sto ricevendo un errore di compilazione "refrenza indefinita". Quindi in myheader.h ho >> extern char * AXIS [3] [8]; e in myfile.c ho >> char * AXIS [3] [8] = {{"X"}, {"Y"}, {"Z"}}; e sto includendo myheader.h nell'altro file.c. Ho provato anche qualche altro trucco, ma non sono sincronizzati. – user1054210

+0

Qualcos'altro è sbagliato, perché funziona ... cosa succede se estrai la macro dall'equazione e cerchi semplicemente di accedere alla matrice in un altro modulo di codice che include il file di intestazione? In secondo luogo, dovrebbe essere solo 'const char * AXIS [3] = {" X "," Y "," Z "};' dato che questi sono stringhe letterali ... da dove ottieni il '8'? – Jason

19

Se si deve mettere in un file di intestazione, utilizzare extern o static:

// option 1 
// .h 
extern char axis[3][8]; 

// .c 
char axis[3][8] = { "X", "Y", "Z" }; 

// option 2 
// .h 
static char axis[3][8] = { "X", "Y", "Z" }; 

Extern comunica al linker che esiste una variabile globale denominata axis definito in uno dei nostri file di implementazione (ad es. in un file .c) e ho bisogno di fare riferimento qui.

static, al contrario, dice al compilatore il contrario: devo essere in grado di vedere e utilizzare questa variabile, ma non esportarla nel linker, quindi non può essere referenziata da extern o causa conflitti di denominazione.

2

mettere questo nel file di intestazione

extern char axis[3][8]; 

e tenere questo in un file C:

char axis[3][8] = {"X", "Y", "Z"}; 
2

aggiungere questo alla tua intestazione:

extern char *axis[]; 

Aggiungi questo al uno file sorgente nel progetto:

char *axis[] = { "X", "Y", "Z", "Time", "Space", "The Scary Door" }; 
+0

Ben fatto! Lo uso quando ho bisogno di creare un menu 'con un numero indefinito di elementi. È perfetto perché in fase di compilazione il compilatore imposta esattamente la lunghezza dell'array, inoltre il codice sembra essere molto più leggibile. – b3h3m0th

0

Michael Barr (Netrino) sconsiglia la dichiarazione di archiviazione in un file di intestazione. Allo stesso modo, lo standard di codifica del sistema embedded Netrino non consente l'uso di storage esterno nelle intestazioni.

Sono generalmente d'accordo con questi principi e ho trovato una buona idea estendere l'archiviazione nei file C che ne hanno bisogno e solo quelli.

Problemi correlati