【问题标题】:Macro not declared in this scope未在此范围内声明的宏
【发布时间】:2013-10-24 03:49:39
【问题描述】:

我正在使用预处理器#define 宏来计算头文件中的函数数量:

#define __INDEX -1

//First group of functions
void func1(void);
#define __FUNC1_INDEX __INDEX + 1
void func2(void);
#define __FUNC2_INDEX __FUNC1_INDEX + 1
#undef __INDEX
#define __INDEX __FUNC2_INDEX

//Second group of functions
void func3(void);
#define __FUNC3_INDEX __INDEX + 1
void func4(void);
#define __FUNC4_INDEX __FUNC3_INDEX + 1
#undef __INDEX
#define __INDEX __FUNC4_INDEX

//Third group of functions
void func5(void);
#define __FUNC5_INDEX __INDEX + 1
void func6(void);
#define __FUNC6_INDEX __FUNC5_INDEX + 1
#undef __INDEX
#define __INDEX __FUNC6_INDEX

#define __NUM_FUNCTIONS __INDEX + 1

预处理器通过前两组函数很好,但是当它到达行时:

#define __FUNC5_INDEX __INDEX + 1

我收到 __INDEX 的“未在此范围内定义”错误。真正令人困惑的是,在第二组函数中[成功地]完成了同样的事情。 __FUNC3_INDEX 取 __INDEX + 1 的值。据我所知,任何地方都没有错别字……有什么问题?

我使用的是 g++ 4.8。

【问题讨论】:

  • 这些是reserved identifiers
  • 啊,我明白了。我使用双下划线来隐藏我只需要使用一次的符号。
  • 我注意到我的其他带有双下划线的宏没有这个问题,我应该停止这样做吗?
  • 嗯...我也在那里测试了我的代码,它运行良好。编译器错误?
  • 当您尝试使用__INDEX 时发生错误。这是您在问题中遗漏的重要部分。

标签: c++ c macros g++ c-preprocessor


【解决方案1】:

你不能指望预处理器宏。它们只是字符串扩展。

在预处理器完成后:

#define __FUNC5_INDEX __INDEX + 1
#define __FUNC6_INDEX __FUNC5_INDEX + 1
#undef __INDEX
#define __INDEX __FUNC6_INDEX

以下定义生效:

__FUNC5_INDEX → __INDEX + 1
__FUNC6_INDEX → __FUNC5_INDEX + 1
__INDEX → __FUNC6_INDEX

没有进行任何计算。此外,没有替换#define指令内执行。

现在,当您尝试扩展 __INDEX(可能是 __NUM_FUNCTIONS 扩展的一部分时,会发生以下情况:

__INDEX → __FUNC6_INDEX
        → __FUNC5_INDEX + 1
        → __INDEX + 1 + 1

此时,宏扩展停止,因为您无法在其自身的扩展中扩展宏。令牌保持原样。

因此,您最终将在程序中使用符号 __INDEX 作为变量。但是由于变量__INDEX 从未定义过,所以会出现错误。

顺便说一下,不要使用以下划线开头的符号,或者一个下划线和一个大写字母开头的符号。这些是为标准库保留的。

【讨论】:

  • 所以不可能做我想做的事?
  • @NmdMystery:差不多。对不起。
  • 但是正如 jxh 所指出的那样,它是否有理由在 Ideone 上编译而没有错误?我会看看这是否适用于 Visual Studio,但我在 Linux 上。我还发誓我见过各种图书馆都做双下划线的事情。
  • @NmdMystery jxh 评论中的第一个链接显示编译器错误。在第二个(C++)中,__NUM_FUNCTIONS 从不使用,所以没有错误。该错误与双下划线无关。
  • 我想我暂时只能手动数一下。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-20
  • 2016-08-09
  • 2019-02-17
  • 2021-01-07
  • 2016-10-27
  • 2016-06-03
相关资源
最近更新 更多