我正在使用预处理器#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。

最佳答案

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

在预处理器完成此操作之后:

#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

此时,宏扩展停止,因为您无法在其自身扩展内扩展宏。 token 按原样保留。

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

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

关于c++ - 未在此范围内声明宏,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19556568/

10-11 18:39