【问题标题】:Scope of #define without a token-string in in C/C++在 C/C++ 中没有标记字符串的#define 范围
【发布时间】:2015-04-08 11:41:11
【问题描述】:

我有以下文件:

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 中定义的数字,

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

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

【问题讨论】:

  • 您是否尝试将#define SECRET_NUMBER_ENABLED 放在#include 之前?
  • 是的,结果相同,尽管我收到编译警告:警告 C4603: 'SECRET_NUMBER_ENABLED' : 未定义宏或使用预编译头文件后定义不同
  • 我的完整代码包含以下内容:#include "stdafx.h" #include "Header.h" 当我将定义放在它们之间时它可以工作,当我将定义放在 2 包含 i 之前收到上面的警告,还是不行,能解释一下原因吗?
  • 我有一个愚蠢的评论,但怎么知道...您是否检查过为定义 SECRET_NUMBER_ENABLED 分配不同的名称?也许在 stdafx.h 或其依赖项中有一个具有该名称的定义
  • 是的,我检查了一个不同的名称,仍然不起作用。

标签: c-preprocessor


【解决方案1】:

假定包含“stdafx.h”之前的任何内容都已定义。
Why stdfax.h should be the first include on MFC applications?

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

这就是为什么你需要定义你的宏

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-04
    • 2013-04-22
    • 2012-04-27
    • 1970-01-01
    • 2010-09-20
    • 2011-05-31
    相关资源
    最近更新 更多