2012-02-08 24 views
8

Mam wiele różnych 3-osiowych czujników, dla których piszę kod testowy. W plikach C dla każdego z nich, mam ten sam ciąg char zdefiniowane:Jak zdefiniować tablicę ciągów znaków w pliku nagłówkowym?

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

którego używam, kiedy „za” wyniki pętli wydrukować oś, która jest zepsuty tak:

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

Zastanowiłem się, aby zaoszczędzić trochę przestrzeni, w której mógłbym zdefiniować tablicę znaków w pliku nagłówkowym, aby móc korzystać z całego miejsca.

Próbowałem wielu rzeczy, ale nie mogę uzyskać tablicy ciągów zdefiniowanej w pliku nagłówkowym, którą mogę przetworzyć, aby przekazać kompilację.

Odpowiedz

10

Aby uniknąć błędów łącznika, musisz zadeklarować tablicę jako extern w pliku nagłówkowym, a następnie zdefiniować tablicę raz w jednym z modułów kodu.

Tak na przykład:

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

następnie w innym module kodu gdzieś:

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

ah to ma sens, ale wydaje się, że basackwards ... Tak więc plik nagłówkowy, który włączam wszędzie, wskazuje wszystkie pozostałe pliki C do lokalnej definicji "myfile.c". – user1054210

+0

Więc mimo że umieściłem plik nagłówkowy w innych plikach c, otrzymuję błąd kompilacji "undefined refrence". Tak więc w myheader.h mam >> zewnętrzny znak * AXIS [3] [8]; oraz w pliku myfile.c Mam >> char * AXIS [3] [8] = {{"X"}, {"Y"}, {"Z"}}; i włączam plik myheader.h do pliku otherfile.c. Próbowałem też kilku innych sztuczek, ale one nie synchronizują się. – user1054210

+0

Coś innego jest nie tak, ponieważ to działa ... co się stanie, jeśli usuniesz makro z równania i po prostu spróbujesz uzyskać dostęp do tablicy w innym module kodu, który zawiera plik nagłówkowy? Po drugie, powinno to być tylko "const char * AXIS [3] = {" X "," Y "," Z "};' ponieważ są to literały łańcuchowe ... skąd czerpiesz '8'? – Jason

19

Jeśli trzeba go umieścić w pliku nagłówkowym, należy extern lub 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 mówi łącznikowi, że istnieje zmienna globalna o nazwie axis zdefiniowany w jednym z naszych plików implementacji (tj. w jednym pliku .c) i muszę o tym tutaj wspomnieć.

static, z drugiej strony, mówi kompilatorowi, że jest odwrotnie: potrzebuję móc zobaczyć i użyć tej zmiennej, ale nie eksportować jej do linkera, więc nie można się do niej odwoływać extern lub przyczyny konflikty nazw.

2

umieścić to w pliku nagłówka

extern char axis[3][8]; 

i zachować to w pliku C:

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

dodać do nagłówka:

extern char *axis[]; 

Dodaj to do jednym plik źródłowy w Twoim projekcie:

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

Dobra robota! Używam tego, gdy potrzebuję stworzyć menu "z nieokreśloną liczbą elementów. Jest idealny, ponieważ w czasie kompilacji kompilator dokładnie ustawia długość tablicy, a ponadto kod wydaje się dużo bardziej czytelny. – b3h3m0th

0

Michael Barr (Netrino) odradza deklarację przechowywania w pliku nagłówkowym. Podobnie, standard kodowania systemu wbudowanego Netrino nie akceptuje używania zewnętrznego zapisu w nagłówkach.

Generalnie zgadzam się z tymi zasadami i uważam, że dobrym pomysłem jest zewnętrzne przechowywanie w plikach C, które tego potrzebują, i tylko te.

Powiązane problemy