Stringization char '#' 在 arm-linux-androideabi-gcc 上使用 c/c++ 宏

Stringification char '#' using c/c++ macro on arm-linux-androideabi-gcc

本文关键字:c++ arm-linux-androideabi-gcc char Stringization      更新时间:2023-10-16

我有一个这样的宏。

#define TO_STR(x) #x

我可以使用这个宏来生成字符串,而不需要字符"之间的输入字符串。类似:

const char* test = TO_STR(hello,macro);
std::cout << test << std::endl;

我可以:CCD_ 2正确。

我的问题是:如何处理输入字符串中的字符#。类似:

const char* shaderprogram = TO_STR(#version 300 es n);

这会导致错误,有什么建议吗?

第一个错误,因为预处理器将把,视为分隔两个参数,而不是作为参数的一部分。

您可以尝试创建第二个宏

#define TO_STR2(a,b) TO_STR(a) "," TO_STR(b)

如果你想用三个参数做同样的事情,你需要定义另一个宏

#define TO_STR3(a,b,c) TO_STR2(a,b) "," TO_STR(c)

这对于更多的争论是可能的,但很混乱——毕竟,宏并不是真正用来做这类事情的。

第二个问题的解决方案是简单的

const char* shaderprogram = "#" TO_STR(version 300 es n);

然而,真正的解决方案是摆脱对宏的痴迷,该宏允许您将"字符从字符串文字中删除。只有当字符串运算符是问题的唯一解决方案时,才在宏中使用它,而不是在有替代方案时作为首选工具。

毕竟,这个

const char* shaderprogram = "#" TO_STR(version 300 es n);   // blech!

不如

const char* shaderprogram = "#version 300 es n"; 

通过多种措施,包括可读性、可维护性等