我有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 的问题是什么?感谢。
答案 0 :(得分:10)
预处理器指令定义和ifdef不能像我想象的那样工作吗?
不,不完全。您似乎相信预处理程序指令遍历文件边界,而它们不会。 #define
d预处理器宏的范围只是它定义的单个文件,或其他文件,只有那些其他文件#include
包含宏定义的文件。
也许有必要想象你在每个文件上单独运行编译器(以及预处理器)(即使你没有意识到,也会这样做)。预处理器无法告诉DEBUG
已在文件中定义它无法运行。
答案 1 :(得分:3)
由于DEBUG
中的#define
为main.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宏以获得全局可见性