在C / C ++中没有令牌字符串的#define的范围

时间:2015-04-08 11:41:11

标签: c-preprocessor

我有以下文件:

MAIN.C

#include "Header.h"

#define SECRET_NUMBER_ENABLED

int main()
{
    printf("Secret number = %d\n", SECRET_NUMBER);
    return 0;
}

Header.h

#ifdef SECRET_NUMBER_ENABLED
    #define SECRET_NUMBER 111
#else
    #define SECRET_NUMBER 222
#endif

打印结果为:222

据我了解,预处理器应扫描Main.c并将每个SECRET_NUMBER替换为Header.h中定义的编号,

因为在Main.c中定义了SECRET_NUMBER_ENABLED,所以预处理器应该采用111定义而不是222.

显然我错了,但我不知道为什么,也不知道如何正确设置,所以只有#define SECRET_NUMBER_ENABLED的C文件才会使用SECRET_NUMBER 111

1 个答案:

答案 0 :(得分:0)

包括" stdafx.h"之前的任何事情;假定已经定义了。
Why stdfax.h should be the first include on MFC applications?

因此任何早期的定义都会丢失。

这就是你需要定义宏

的原因
  • 包括stdafx.h后 (因为否则会被忽略)
  • 包括你自己的标题之前 (因为否则他们不会对你的标题产生影响,
    标题中的#ifdef在看到main.c中的定义之前进行评估)