2013-05-08 29 views
1

我有3个文件:预处理器指令define和ifdef不按我想象的那样工作?

的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 block?如果我在test.h或test.c中写入#define DEBUG一切都很好。那么问题是什么#define DEBUG在main.c中?谢谢。

回答

7

预处理器指令define和ifdef不工作,因为我想象?

不,不是。您似乎相信预处理器指令会遍历文件边界,而他们不会。 d预处理器宏的范围仅为它在其中定义的单个文件,或其他文件,仅当其他文件包含宏定义的文件时#include

也许这会帮助你想象一下,在每个文件上分别运行编译器(以及预处理器)(即使你没有意识到,你也可以这样做)。预处理器无法告诉DEBUG已经在一个文件中被定义了,它并不在其上运行。

+0

downvote的原因是什么? – 2013-05-08 16:56:24

1

您在main.c中定义了DEBUG - test.c不可见 - 如果您希望DEBUG对main.c和test.c都可见,您应该在test.h中定义它

1

由于您在main.c中定义了DEBUG,但test.c不包含main.c,所以在编译转换单元时,预处理器符号不存在。

您应该在头文件中声明全局作用域宏,然后将其包含在需要的地方。

2

因为DEBUG#define'd在main.c中,所以在test.c中不可见。您需要#define它在构建设置,或在标题

-1

在makefile中为DEBUG宏定义全局可见性

+1

这没有帮助。该定义仍然只会影响main.c.你不能以你所建议的方式有效地重写test.h – simonc 2013-05-08 16:26:03