c++ - C/C++ 宏扩展为参数,参数为字符串

标签 c++ c-preprocessor stringification

我有许多变量与工程规范文档中的元素同名,因此名称的字符串版本也很有用。

我发现自己经常使用这样的宏:

#define MACRO(a) a, #a

典型用法是:

void someFunction(int a, const char *name);

someFunction(MACRO(meaningfully_named_variable));

我的问题有三个:

  • 有更好的方法吗?
  • Boost 或其他库中是否提供类似的宏?
  • 如果不是,我如何改进和重命名它以使其清晰和有用?

编辑 我应该说以上是一个最小的例子。该函数可能有其他参数,命名实体可能是数据成员,甚至可能是函数本身。

我正在为 C++ 考虑的另一个扩展是类 NamedRef,它可以接收宏的内容。

template <typename T>
struct NamedRef
{
    NamedRef(T *t, const char *name) : t(t), name(name) { }
    T *t;
    const char *name;
};

template <typename T>
NamedRef<T> namedRef(T &t, const char *name)
{
    return NamedRef<T>(&t, name);
}

#define WITH_NAME(a) a, #a

// more sophisticated usage example
void otherFunction(double, NamedRef<int>, bool);

otherFunction(0.0, namedRef(object.WITH_NAME(meaningful_member_name)), false);

最佳答案

你可以更进一步:

#define SOMEFUNCTION(a) somefunction(a, #a)

但是,这只有在您多次调用同一个函数时才有用。否则,我认为没有比您的示例更好的方法了。当然,您应该将宏的名称更改为更有意义的名称,例如 ARGUMENTS 或其他名称。

关于c++ - C/C++ 宏扩展为参数,参数为字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8597635/

相关文章:

c++ - 可变参数宏 : Reuse variadic arguments (Boost. fusion )

c - 使用预处理器将代码转换为字符串

c - 在未定义之前保存扩展的宏结果

使用 C 预处理器将 int 连接到字符串

c++ - 从通用函数/lambda 推导出函数参数

c++ - 编译c++代码时出错 逗号运算符的右操作数不起作用

C block 变成表达式: ( {int a = 1; int b = 2; a+b;} ) equals 3

c++ - Eigen:获取稀疏矩阵的核

c++ - 在运行时加载 OpenGL 扩展

c++ - 在 C/C++ 宏中同时使用 { 和 #if