在 arm-linux-androideabi-gcc 上使用 c/c++ 宏对字符 '#' 进行字符串化

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

我有一个这样的宏。

#define TO_STR(x) #x

我可以使用这个宏来生成字符串,而无需在 char " 之间输入字符串。 喜欢:

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

我可以得到: hello,macro 正确。

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

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"; 

通过多项措施 - 包括可读性、可维护性等