是否可以使用#stringization定义常量?

时间:2011-11-15 22:39:39

标签: c++ c

我有一些字符串常量,后面的字符串常常由早期字符串组成

const char* ID       = "01099BB2";
const char* FS_LOCATION_ROOT =  "fs:/~0x";

我想创建连接的常量并尝试使用#,如下所示但是出现了编译错误:

const char* FS_LOCATION = FS_LOCATION_ROOT#ID;

有没有办法以这种方式组合字符串?

2 个答案:

答案 0 :(得分:4)

这取决于你想对这些字符串做什么。字符串化器操作数#是预处理器的一部分,因此必须出现在宏定义中。虽然它看起来不会对你的特殊情况有所帮助。但是,您可以简单地使用secuential字符串文字连接的事实。

"fs:/~0x" "01099BB2" is turned into "fs:/~0x01099BB2"

但是你不能将它用于变量,只能用文字。你可以这样做:

#define ID "01099BB2"
#define FS_LOCATION_ROOT "fs:/~0x"

#define FS_LOCATION FS_LOCATION_ROOT ID

或更好

const char* FS_LOCATION = FS_LOCATION_ROOT ID

但是在定义名为ID的宏之前,我会考虑两次。

答案 1 :(得分:1)

一旦将它们定义为符号。我想你可以同时生成两者。

#define stupid_macro(ID,ROOT) \
  const char *id = #ID ; \
  const char *root = #ROOT ; \
  const char *both = #ID #ROOT ;

我没有对它进行测试以验证stringize的工作原理,但它应该以此结束。

const char *id = "id_val" ;
const char *root = "root_val" ;
const char *both = "id_val" "root_val" ;

最后一个将连接起来。这当然是合法的,虽然我不能说它的道德。