在 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";
通过多项措施 - 包括可读性、可维护性等
我有一个这样的宏。
#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";
通过多项措施 - 包括可读性、可维护性等