Препроцессор C во включаемых заголовочных файлах - PullRequest
0 голосов
/ 03 февраля 2010

У меня есть структура, определенная в заголовочном файле с именем data.h.

Я включаю data.h в myfile.c.

В структуре у меня есть часть переменных, заблокированных с помощью:

#ifndef TEST
 int x;
#endif

и в myfile.c у меня есть:

#ifdef TEST
localx++;
#else
mystruct.x++; //<-compiler complains on this line when compiling
#endif

Когда я пытаюсь скомпилировать с -DTEST, я получаю компилятор с жалобой на то, что тип mystruct не содержит поля с именем x. Что с этим?

У меня нет под рукой компилятора C , поэтому вот что я только что набрал:

в data.h

typdef struct {

#ifndef TEST
int x;
#endif
int y;
} coords;

в myfile.c

#include "data.h" 
static coords coord1;
int localx;

int main( ) 
{ 
#ifdef TEST
  localx = 1;
#else
  coord1.x = 1;
#endif

  coord1.y = 2;
  printf("%i\n", coord1.x);
  printf("%i\n", coord1.y);
  printf("%i\n", localx);

  return 0; 
} 

Это компилируется, когда я набираю cc myfile.c, но не с cc myfile.c -DTEST Я использую компилятор MIPSPro C с ссылками здесь .

Ответы [ 3 ]

2 голосов
/ 03 февраля 2010

Самое последнее редактирование (которое может отличаться к тому времени, когда кто-то его читает) будет иметь проблему в разделе, содержащем кучу операторов printf().Строка:

 printf("%i\n", coord1.x);

ссылается на член x структуры независимо от настройки макроса препроцессора TEST.Он также должен находиться внутри секции условной компиляции для правильной компиляции (а не для компиляции вообще), когда элемент x не существует.

1 голос
/ 03 февраля 2010

Поскольку вы используете ifndef для поля x, его можно использовать только в том случае, если TEST не определен !!

# ifdef позволяет компилировать раздел программы только в том случае, если был определен макрос, указанный в качестве параметра, независимо от того, какое его значение. Например:

#ifdef TABLE_SIZE

int table[TABLE_SIZE];

#endif  

В этом случае строка кода int table [TABLE_SIZE]; компилируется, только если TABLE_SIZE был ранее определен с помощью #define, независимо от его значения. Если она не была определена, эта строка не будет включена в компиляцию программы.

# ifndef служит для полной противоположности: код между директивами #ifndef и #endif компилируется, только если указанный идентификатор не был ранее определен. Например:

#ifndef TABLE_SIZE
#define TABLE_SIZE 100
#endif
int table[TABLE_SIZE];

В этом случае, если при достижении этого фрагмента кода макрос TABLE_SIZE еще не был определен, он будет определен со значением 100. Если он уже существует, он сохранит свое предыдущее значение после директивы #define не будет выполнен.

От: http://www.cplusplus.com/doc/tutorial/preprocessor/

0 голосов
/ 03 февраля 2010

За исключением опечатки (typdef), ваш пример прекрасно компилируется для меня, используя gcc.

Редактировать: Новый пример не должен компилироваться.Вам нужно обернуть каждую ссылку на «x» в директивах #ifdef.

Кроме того, gcc принимает флаг -D перед списком файлов, но у меня нет доступа к MIPSpro.В документах говорится, что у вас не работает командная строка.

...