预处理器指令定义和ifdef不能像我想象的那样工作?

时间:2013-05-08 16:20:59

标签: c c-preprocessor

我有3个文件:

的main.c

#include <stdio.h>
#include <stdlib.h>
#include "test.h"

#define DEBUG

int main()
{
  testFunction();
    return 0;
}

test.h

#ifndef TEST_H
#define TEST_H
#include <stdio.h>
#include <stdlib.h>

void testFunction();

#endif // TEST_H_INCLUDED

test.c的

#include "test.h"

void testFunction(){
  #ifdef DEBUG
    printf("I'm inside the testFunction\n");
  #endif
}

问题:为什么程序不能在 #ifdef DEBUG 块中打印内容?如果我在test.h或test.c中编写 #define DEBUG ,一切都很好。那么在main.c中 #define DEBUG 的问题是什么?感谢。

5 个答案:

答案 0 :(得分:10)

  

预处理器指令定义和ifdef不能像我想象的那样工作吗?

不,不完全。您似乎相信预处理程序指令遍历文件边界,而它们不会。 #define d预处理器宏的范围只是它定义的单个文件,或其他文件,只有那些其他文件#include包含宏定义的文件。

也许有必要想象你在每个文件上单独运行编译器(以及预处理器)(即使你没有意识到,也会这样做)。预处理器无法告诉DEBUG已在文件中定义它无法运行。

答案 1 :(得分:3)

由于DEBUG中的#definemain.c,因此在test.c中无法显示。您需要在构建设置中或在标题

#define

答案 2 :(得分:2)

由于您在DEBUG内定义了main.c,但test.c未包含main.c,因此在编译翻译单元时,预处理器符号不存在。

您应该在头文件中声明全局范围宏,然后将其包含在需要的位置。

答案 3 :(得分:1)

你在main.c中定义了DEBUG--这对test.c是不可见的 - 如果你想让main.c和test.c看到DEBUG,你应该在test.h中定义它。

答案 4 :(得分:0)

在makefile中定义DEBUG宏以获得全局可见性