C ++宏:操作参数(具体示例)

我需要更换

GET("any_name") 

 String str_any_name = getFunction("any_name"); 

困难的部分是如何修剪引号。 可能? 有任何想法吗?

怎么样:

 #define UNSAFE_GET(X) String str_##X = getFunction(#X); 

或者,为了安全防范嵌套宏问题:

 #define STRINGIFY2(x) #x #define STRINGIFY(x) STRINGIFY2(x) #define PASTE2(a, b) a##b #define PASTE(a, b) PASTE2(a, b) #define SAFE_GET(X) String PASTE(str_, X) = getFunction(STRINGIFY(X)); 

用法:

 SAFE_GET(foo) 

这是编译的:

 String str_foo = getFunction("foo"); 

关键点:

  • 使用##将宏参数组合成单个标记(标记=>变量名称等)
  • 和#字符串化一个宏参数(在C / C ++中做“reflection”时非常有用)
  • 为宏使用前缀,因为它们都在相同的“命名空间”中,并且您不希望与任何其他代码发生冲突。 (我根据你的用户名选择了MLV)
  • 如果你嵌套宏,包装宏有帮助,即从另一个宏调用MLV_GET与其他合并/字符串化参数(根据下面的评论,谢谢!)。

一种方法是在调用宏时不引用名称:

 #include  #define GET( name ) \ int int##name = getFunction( #name ); \ int getFunction( char * name ) { printf( "name is %s\n", name ); return 42; } int main() { GET( foobar ); } 

在回答你的问题时,不,你不能在C ++中“剥离”引号。 但正如其他答案所示,您可以“添加它们”。 既然你总是会使用字符串文字(对吗?),你应该可以切换到新方法。