C++ 宏 : manipulating a parameter (specific example)

标签 c++ c c-preprocessor

我需要更换

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/

相关文章:

c++ - 在这种情况下 std::vector 是否被复制或移动?

c++ - 如何使用 x264 与 ffmpeg 进行编码?

在 Fortran 代码中调用 C 函数/子例程

c - 当我在 Mac OS X 上编译它时,它正在考虑引号 ("%d") 作为未定义的 ascii 符号

c++ - 如果我不给它一点额外的空间,弦就会发疯。谁能解释这里发生了什么?

c++ - 接受新对象的宏

c++ - 模板参数计算

c++ - 使用变量的类型作为模板参数

c++ - 修改文本输入中的特定字符 (C++)

c-preprocessor - 取消定义类似函数的宏