C++ 是否可以对定义的常量使用#字符串化?

C++ 是否可以对定义的常量使用#字符串化?,c++,c,C++,C,我有一些字符串常量,后面的常量通常由前面的常量组成 const char* ID = "01099BB2"; const char* FS_LOCATION_ROOT = "fs:/~0x"; 我想创建连接的常量,并尝试使用#如下,但出现编译错误: const char* FS_LOCATION = FS_LOCATION_ROOT#ID; 有没有一种方法可以用这种方式组合字符串?这取决于你想用这些字符串做什么。stringizer操作数#是预处理器的一部分,因此必须出现在宏定

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

const char* ID       = "01099BB2";
const char* FS_LOCATION_ROOT =  "fs:/~0x";
我想创建连接的常量,并尝试使用#如下,但出现编译错误:

const char* FS_LOCATION = FS_LOCATION_ROOT#ID;

有没有一种方法可以用这种方式组合字符串?

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

"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

的宏之前,我会三思而后行,这取决于您想对这些字符串执行什么操作。stringizer操作数
#
是预处理器的一部分,因此必须出现在宏定义中。不过,这看起来对你的特殊情况没有帮助。但是,您可以简单地使用这样一个事实,即将连续字符串文字连接起来

"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

的宏之前,我会三思而后行,而不是将它们定义为符号。我想你可以同时生成这两个

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

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

一旦它们被定义为符号,就不可能了。我想你可以同时生成这两个

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

最后一个将连接它们。这当然是合法的,但我不能说它有什么道德。

字符串化是一种预处理器功能。在实际的C语言中没有这样的东西。如果这些是真常量,您可以使用预处理器宏和#定义…字符串化是预处理器的一个功能。在实际的C语言中没有这样的东西。如果这些是真常量,你可以使用预处理器宏和#defines…谢谢,我没意识到它们可以像那样连接起来。名称ID是一个截短版本,用于在此处发布,而不是真实名称。谢谢,我没有意识到它们可以像那样连接在一起。名称ID是用于在此处发布的截断版本,而不是真实名称。