【发布时间】:2014-05-31 09:50:36
【问题描述】:
我使用宏来连接字符串,例如:
#define STR1 "first"
#define STR2 "second"
#define STRCAT(A, B) A B
拥有STRCAT(STR1 , STR2 ) 会产生"firstsecond"。
我在其他地方以这种方式将字符串关联到枚举:
enum class MyEnum
{
Value1,
Value2
}
const char* MyEnumString[] =
{
"Value1String",
"Value2String"
}
现在以下方法不起作用:
STRCAT(STR1, MyEnumString[(int)MyEnum::Value1])
我只是想知道是否可以构建一个将#defined 字符串文字与const char* 连接起来的宏?否则,我想我会不用宏,例如以这种方式(但也许你有更好的方式):
std::string s = std::string(STR1) + MyEnumString[(int)MyEnum::Value1];
【问题讨论】:
-
你为什么这么想用宏?你知道他们在 C++ 中被强烈劝阻吗?
-
@tenfour 我真的不知道(因为我不是 C++ 专家)。所以你会建议避免使用 STRCAT(STR1, STR2) 宏?您能否详细说明使用它的缺点是什么?
-
查看这里以获得好的答案:stackoverflow.com/a/14041847/402169。但对我来说,更好的问题是:既然可以使用函数,为什么还要使用宏?
-
感谢您的链接。好吧,在我的情况下,我确保我的宏不能与其他名称冲突(宏名称带有前缀),并且我只将它们用于字符串,它为我的 IO dll 中的变量提供名称,该名称也被其他用户使用。如您所说,另一种选择可能是提供返回变量名称的函数,也许是通过将枚举作为输入。我会考虑是否值得切换到这个解决方案。
标签: c++ macros c-preprocessor string-concatenation