C预处理器包含头文件

时间:2010-02-03 19:08:26

标签: c include c-preprocessor

我有一个名为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 编译器。

3 个答案:

答案 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指令以来的先前值不会被执行。

来自:http://www.cplusplus.com/doc/tutorial/preprocessor/

答案 2 :(得分:0)

除了拼写错误(typdef)之外,你的例子使用gcc为我编译好。

编辑: 新示例不应该编译。您需要在#ifdef指令中包含对“x”的每个引用。

此外,gcc在文件列表前接受-D标志,但我无法访问MIPSpro。文档说你命令行乱序。