如果我在C语言中定义了一个常量字符,是否可以将其隐藏为字符串文字?
#ifdef WIN32
# define SEP '\\'
# define ALTSEP '/'
#else
# define SEP '/'
# define ALTSEP '\\'
#endif
#define SOME_STRING_LITERAL "foo"
/* code snippet */
/* Desired string: "prefix_foo/bar" */
const char *path = "prefix_" SOME_STRING_LITERAL SEP "bar";
当然这会失败,因为SEP
没有将其定义为字符串文字,但是有什么方法可以使SEP
串联正确吗?还是我需要另一个定义,例如#define SEP_STR "/"
。
我认为您无法在C中做到这一点。
核心问题是"
符号太基础了,以至于即使在预处理器不知道它应该被视为预处理令牌之前,也要对其进行解释。
使用#运算符进行字符串化将无济于事。即使你写一个像
#define STRINGINIZE(x) #x
#define CHAR_TO_STR(ch) STRINGINIZE(ch)
然后以
const char *path = "prefix_" SOME_STRING_LITERAL CHAR_TO_STR(SEP) "bar";
这样做对您没有好处,因为您最终会得到类似以下的字符串
prefix_foo`\`bar
您也不能这样做:
const char *path = "prefix_" SOME_STRING_LITERAL CHAR_TO_STR(SEP)[1] "bar";
因为它与我们一开始的内容完全相同,并且无法编译。
同样,您不能基于串联预处理器令牌来制定解决方案,因为它"
是比更为基本的符号##
。
因此,唯一的解决方案似乎是将字符声明为字符串文字。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句