我有许多变量与工程规范文档中的元素同名,因此名称的字符串版本也很有用。
我发现自己经常使用这样的宏:
#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/