我正在使用预处理器#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。
答案 0 :(得分:2)
您无法使用预处理器宏。它们只是字符串扩展。
预处理器完成之后:
#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
,因此会出现错误。
顺便说一下,不要使用以两个下划线开头的符号,或者使用一个下划线和一个大写字母。这些是为标准库保留的。