【发布时间】:2012-01-25 17:25:46
【问题描述】:
我有许多变量与工程规范文档中的元素命名相同,因此名称的字符串版本也很有用。
我发现自己经常使用这样的宏:
#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);
【问题讨论】:
-
我要做的就是为宏选择一个更具描述性的名称,例如
WITH_NAME(). -
按照@MarkRansom 的建议去做。我的回答是“没关系”,而且 Boost 有一个名为
BOOST_STRINGIZE(X)的宏。
标签: c++ c-preprocessor stringification