【问题标题】:C preprocessor in include header files包含头文件中的 C 预处理器
【发布时间】:2010-02-03 19:08:25
【问题描述】:

我在名为 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 编译器。

【问题讨论】:

  • 请显示结构的完整声明。此外,包含它的部分,以及违规行周围的一些代码
  • 你能确定你发布的是真实代码吗?现在,当且仅当它不被使用时,似乎有一个x。如果有一个细微的错误,我们不会在没有真实代码的情况下捕获它。
  • 好的,尝试在代码标签中发布更新帖子..但我认为# 将其扔掉了..但你可以理解
  • @Derek:您到底是如何调用编译器的? - 我的快速测试显示您的示例 data.hmyfile.c 示例没有问题(data.h 中关键字 typedef 的拼写错误除外) - 无论是否在编译器命令行上定义了 TEST。你真的应该考虑删除并重新发布这个问题,一旦你可以从你的问题中提供准确的剪切粘贴细节,这样这里的人就不会追逐鬼魂了。
  • 你在“typdef”中有错字,但我想这只是一个复制粘贴问题

标签: c include c-preprocessor


【解决方案1】:

您最近的编辑(在任何人阅读本文时可能会有所不同)在包含一堆 printf() 语句的部分中会遇到问题。行:

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

正在引用结构的x 成员,而不管TEST 预处理器宏的设置如何。当x 成员不存在时,它也需要在条件编译部分中才能正确编译(而不是根本不编译)。

【讨论】:

    【解决方案2】:

    由于您对字段 x 使用 ifndef,因此只有在未定义 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/

    【讨论】:

    • 注册用户加入日期:2009 年 11 月帖子:23 在 data.h 代码:typdef struct { #ifndef TEST int x; #endif int y; } 坐标;在 myfile.c 代码中:#include "data.h" static coords coord1;诠释本地化; 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;这使用“cc myfile.c”编译,但不使用“cc myfile.c -DTEST”编译我在 IRIX 上使用 MIPSpro 编译器
    • 他有正确的逻辑'round:如果定义了TEST,则不要将变量添加到结构中并使用局部变量;如果未定义 TEST,则将变量添加到结构并使用它。
    • 他展示的#ifdef 逻辑是正确的。他使用 -DTEST 运行,因此应该定义 struct 中的 x,因此应该编译代码。他在某个地方出现了细微的错误,uncleo 尝试了他发布的代码,它工作正常
    • @pm100,@uncleo :你说得对,我的帖子是在编辑问题之前发布的......我现在也可以编辑我的帖子
    • 实际上我的评论是错误的,#ifndef 和 -DTEST 结构 x 不存在,但编译不应该尝试使用它
    【解决方案3】:

    除了拼写错误 (typdef),你的示例使用 gcc 对我来说编译得很好。

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

    此外,gcc 在文件列表之前接受 -D 标志,但我无权访问 MIPSpro。文档说你的命令行有问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-06
      • 1970-01-01
      • 1970-01-01
      • 2018-05-11
      • 2019-06-22
      • 1970-01-01
      • 1970-01-01
      • 2012-06-14
      相关资源
      最近更新 更多