我有一个名为data.h的头文件中定义的结构。
我在myfile.c中包含data.h。
在结构中,我将部分变量屏蔽掉:
#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
时会编译
我使用的是引用here的MIPSPro C 编译器。
答案 0 :(得分:2)
您最近的编辑(在任何人阅读本文时可能会有所不同)在包含printf()
个语句的部分中会出现问题。这一行:
printf("%i\n", coord1.x);
无论x
预处理器宏的设置如何,都引用结构的TEST
成员。它也需要在条件编译部分内部,以便在x
成员不存在时正确编译(而不是完全编译)。
答案 1 :(得分: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指令以来的先前值不会被执行。
答案 2 :(得分:0)
除了拼写错误(typdef)之外,你的例子使用gcc为我编译好。
编辑: 新示例不应该编译。您需要在#ifdef指令中包含对“x”的每个引用。
此外,gcc在文件列表前接受-D标志,但我无法访问MIPSpro。文档说你命令行乱序。