gpt4 book ai didi

c++ - C++ 宏展开的一个问题

转载 作者:行者123 更新时间:2023-11-30 17:48:04 26 4
gpt4 key购买 nike

当我使用 g++ 编译 cpp 文件时,gcc 给出以下错误消息:

error: pasting "TBSYS_LOG_LEVEL_" and "-" does not give a valid preprocessing token

然后查看源码,发现有三个宏定义:

  • fileA.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))
  • fileB.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。

关于c++ - C++ 宏展开的一个问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18710441/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com