c++ 预处理器中的字符串文字和宏连接

hmae6n7t  于 2023-10-20  发布在  其他
关注(0)|答案(2)|浏览(106)

最终更新:
在阅读了许多相关的问题和答案后,我觉得答案很简单,尽管令人失望:在预处理器中不可能连接字符串文字。添加宏到组合并没有改变这一点,它只会混淆图片。
我稍后会删除这个问题,除非有人说上面的是错误的。

我试图从几个字符串文字和一些宏定义一个字符串文字。
是的,我知道相邻的字符串字面量是由编译器连接的。这里有数百个问题“如何在预处理器中连接字符串”,它们都有相当多的the same answer。但它并没有回答真正的问题。
我正在尝试这样做(下面的代码只是一个提示,它需要第二层参数化宏来实际编译)

#define A 1
#define B 2

#define STR1 "Up\r" #A "\r" #B "\r"
#define STR2 "Down\r" #B "\r" #A "\r"

char* strings[] = { STR1, STR2 };

在这个例子中,当我在IDE中检查STR 1宏扩展时,我希望看到"Up\r1\r2\r",而不是"Up\r" "1" "\r" "2" "\r"
更新:
下面的示例显示IDE完全能够显示合并的宏,在这种情况下,STR1上的宏扩展显示“12”。只有当我试图将字符串文字添加到混合中时,我才会遇到问题。

#define CON1(a,b) a ## b
#define CON2(a,b) CON1(a,b)
#define STR1 CON2(A,B)

我的问题是:是否可以在预处理器中连接字符串和宏,以获得最终的字符串文字作为一个完整的字符串?

l7wslrjt

l7wslrjt1#

你试过stringizing吗?

#include <cstdio>

#define A 1
#define B 2

#define XSTR(A) #A
#define STR(A) XSTR(A)

#define STR1 "Up\n" STR(A) "\n" STR(B) "\n"

int main() {
  printf("%s\n", STR1);
  return 0;
}

在我的Ubuntu 20上,它打印:

Up
1
2
s5a0g9ez

s5a0g9ez2#

**否。**相邻字符串的连接发生在第6阶段,而预处理发生在第4阶段。

您没有提到您使用的是哪个IDE,但是您可以提交一个功能请求,该请求可以选择将扩展的宏的字符串连接起来。但是,它不应该是默认选项,因为如果是这样的话,IDE就会在宏精确扩展到什么方面对您撒谎。

相关问题