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

Mal*_*eev 5 c c++ c-preprocessor

我需要更换

GET("any_name")
Run Code Online (Sandbox Code Playgroud)

String str_any_name = getFunction("any_name");
Run Code Online (Sandbox Code Playgroud)

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

Mac*_*cke 26

怎么样:

#define UNSAFE_GET(X) String str_##X = getFunction(#X);
Run Code Online (Sandbox Code Playgroud)

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

#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));
Run Code Online (Sandbox Code Playgroud)

用法:

SAFE_GET(foo)
Run Code Online (Sandbox Code Playgroud)

这是编译的内容:

String str_foo = getFunction("foo");
Run Code Online (Sandbox Code Playgroud)

关键点:

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

  • 一个注释 - 使用标记粘贴和字符串化操作符应该使用类似函数的宏间接完成,以防止在将来使用宏参数时出现问题.请参阅:http://stackoverflow.com/questions/216875/in-macros/217181#217181 (3认同)