C++ 宏扩展的一个问题
One issue with c++ macro expand
当我使用 g++ 编译 cpp 文件时,gcc 给出以下错误消息:
错误:粘贴"TBSYS_LOG_LEVEL_"和"-"未提供有效的预处理令牌
然后我检查了源代码,发现有三个宏定义:
- 在文件A.h中:
#define TBSYS_LOG_LEVEL_ERROR 0 #define TBSYS_LOG(level, _fmt_, args...) ((TBSYS_LOG_LEVEL_##level>TBSYS_LOGGER._level) ? (void)0 : TBSYS_LOG_BASE(level, "[%ld] " _fmt_, pthread_self(), ##args))
- 在文件B.h中:
#define ERROR -1
事实证明,在宏"TBSYS_LOG"展开之前,"ERROR"被扩展为"-1"。
展开"TBSYS_LOG_LEVEL_##level"后的结果是"TBSYS_LOG_LEVEL_-1",最后导致错误消息。
但是,据我所知,在这种情况下宏不会扩展。(使用 ## 时)
然后我写了另一个 cpp 文件来尝试这个:
#define FOOBAR 100 #define TEST(PARAM) FOO##PARAM #define BAR -1 int main(){ cout<<TEST(BAR)<<endl; }
这可以通过编译。输出为 100。这些宏的定义与前一个宏一样,但不会将"BAR"扩展到"-1",不会导致错误消息。
有谁知道为什么宏在前一种情况下会扩展?
更新:使用 TBSYS_LOG 的代码是:
TBSYS_LOG(ERROR, "expand data buffer failed, length: %d", bufsize);
#define FOOBAR 100
#define TEST(PARAM) FOO##PARAM
#define BAR -1
int main(){
cout<<TEST(BAR)<<endl;
}
##PARAM
表示符号本身。所以TEST(BAR)
这里展开为FOO##BAR
(不是结果,只是为了解释),即FOOBAR
,按#define FOOBAR 100
,是100。
BAR
永远不会显示为独立符号(用空格或其他分隔符分隔),因此不会替换为 -1。
FOO##PARAM 将在编译时展开,因此在运行代码之前,宏的值已修复,它是 FOOBAR,如果你添加一个新参数,如下所示:
#define FOOBAR 100
#define TEST(PARAM) FOO##PARAM
#define BAR -1
#define GOOD 10
int main(){
cout<<TEST(GOOD)<<endl;
}
编译器可能永远不会让它为你工作。
相关文章:
- 在决定是通过参考还是通过价值时,尺寸真的是一个问题吗
- 在用于格式4的arm模拟器中实现功能时的一个问题
- 为什么在分配给成员变量之前获取unique_ptr的返回是一个问题?
- 我在使用 boost::serialization 时遇到了一个问题,我的代码在 Linux 中运行良好,但在 Wind
- 在C++,重复申报仍然是一个问题吗?
- "Memory Fragmentation"这仍然是一个问题?
- 缺少类型说明符和另一个问题
- 在浮点精度成为一个问题之前,可以将多少个浮点值加在一起
- 关于使用C++结构的一个问题
- 关于骰子概率计算的一个C++问题
- 我想知道我将如何实现 + 运算符重载.我已经从我上一个问题中计算出 += 运算符重载
- 组合理论的一个问题
- 我有一个问题,创建了C 中阻塞队列的向量
- CreateFileWindows XP和7中存在一个问题
- 我是编码新手,我面临一个问题
- 在添加新记录和访问记录时有一个问题
- 专用纯虚拟模板函数(未定义引用)的另一个问题
- 在C++中,这个Eigen::张量的声明是安全的,还是有缺陷的?我应该为它提交一个问题吗
- 我如何让我的部分代码循环并重复一个问题,直到答案是有效的输入C++
- 我的程序停止工作,因为检测到一个问题