6

我有 3 个文件:

主程序

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

#define DEBUG

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

测试.h

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

void testFunction();

#endif // TEST_H_INCLUDED

测试.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有什么问题?谢谢。

4

5 回答 5

13

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

不,不完全是。您似乎相信预处理器指令会遍历文件边界,但事实并非如此。d 预处理器宏的范围#define仅是定义它的单个文件,或者仅当其他#include文件包含宏定义的文件时才适用于其他文件。

也许想象一下您在每个文件上分别运行编译器(以及预处理器)会有所帮助(即使您没有意识到,您也会这样做)。预处理器无法判断DEBUG已在它不操作的文件中定义。

于 2013-05-08T16:23:39.843 回答
3

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

于 2013-05-08T16:22:45.413 回答
2

因为您DEBUG在内部定义main.c但在编译翻译单元时test.c没有包含main.c,所以预处理器符号不存在。

您应该在头文件中声明全局范围宏,然后在需要的地方包含它。

于 2013-05-08T16:22:27.750 回答
1

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

于 2013-05-08T16:22:22.953 回答
0

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

于 2013-05-08T16:24:34.693 回答