2010-02-03 1 views
-1

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

Я включаю данные.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 ссылающийся на компилятор here.

+1

Просьба показать полное объявление структуры. Кроме того, часть, где она включена, и некоторый код вокруг строки нарушения –

+0

Не могли бы вы убедиться, что вы отправляете реальный код? Прямо сейчас, похоже, что есть 'x', если и только если он не используется. Если есть небольшая ошибка, мы не поймаем ее без реального кода. –

+0

one sec..didnt post nicely – Derek

ответ

2

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

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

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

1

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

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

#ifdef TABLE_SIZE 

int table[TABLE_SIZE]; 

#endif 

В этом случае строка таблицы int [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

Зарегистрированный пользователь Регистрация: Nov 2009 Сообщений: 23 в data.h Код: typdef STRUCT { # ifndef TEST int x; #endif int y; } координаты; in 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); возвращение 0; } компилируется с «куб.см myfile.c», но не компилируется с «куб.см myfile.c -DTEST» Я использую компилятор MIPSpro на IRIX – Derek

+0

Он имеет логику правильный путь «раунд: если TEST является определены, не добавляйте переменную в структуру и не используйте локальную переменную; если TEST не определен, добавьте переменную в структуру и используйте ее. – UncleO

+0

Логика #ifdef, которую он показывает, верна. Он работает с -DTEST, поэтому x в структуре следует определить, и поэтому код должен компилироваться. У него есть тонкая ошибка где-то, у нечистого пробовал его опубликованный код, и он отлично работает – pm100

0

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

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

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