题
我需要更换
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=>的变量名称、等等)
- #可转换成字符串宏观参数(非常有用的时候这样做"反射"在C/C++)
- 使用的前缀为您的宏,因为他们都是在相同的"空间"和你不想碰撞与任何其他代码。(我选择了玛娜瓦雷的基础上你的用户名)
- 包装的宏帮助如果你窝宏,即呼叫MLV_GET从另一个宏与其他合并/stringized参数(如下面的评论,谢谢!).
其他提示
一种方法是在调用宏时不引用名称:
#include <stdio.h>
#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 ++中的引号。但正如其他答案所示,您可以“添加它们”。既然你总是使用字符串文字(对吧?),你应该可以切换到新方法。
不隶属于 StackOverflow