我需要更换
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");
要点:
- 使用##将宏参数组合成一个单独的token(token => 变量名等)
- 以及 # 将宏参数字符串化(在 C/C++ 中进行“反射”时非常有用)
- 为您的宏使用前缀,因为它们都在同一个“ namespace ”中,并且您不希望与任何其他代码发生冲突。 (我根据你的用户名选择了MLV)
- 如果您嵌套宏,包装宏会有所帮助,即从另一个具有其他合并/字符串化参数的宏调用 MLV_GET(根据下面的评论,谢谢!)。
关于C++ 宏 : manipulating a parameter (specific example),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/806543/