我想要一个宏,比如MAGIC
或MAGIC(*this)
,以便:
struct Foo {
Foo() {
cout << MAGIC; //Prints 1
}
void f() {
cout << MAGIC; //Prints 0
}
};
我只对这种用法感兴趣。我不关心从其他宏开始使用宏时会发生什么。如果它也适用于非成员函数,那将是很好的。
理论上,宏可以扩展到一些模板特征,然后才能真正发挥作用。我正在使用MSVC,它提供了一组宏来将当前函数名称作为字符串文字。如果我可以将该文字与类名文字进行比较,我也认为我可以使用它,那么我可以做到(假设没有其他问题与名称修改和模板相关联),但是你不能传递char *文字作为模板参数,所以我担心它不可能实现这一点。
我知道它可以在运行时通过使用strcmp来完成,并且可能将结果缓存在本地静态变量中,但是我想在编译时使用它。
以下是关于GCC的,但它真的很难看,因为它破坏了语法。 如果我至少可以像传统的C ++语法那样使用开口花括号,那将是很好的。
constexpr bool same_str(char const* a, char const* b) {
return *a==*b && (*a==0 || same_str(a+1, b+1));
}
template< bool bSame >
struct SSame {
static int const value = (int)bSame;
};
#define MAGIC SSame<same_str(c_strFuncName, c_strClassName)>::value
#define DEF_CLASS(x) x { constexpr static char const* c_strClassName = #x;
#define DEF_FUNC(x, ...) x(__VA_ARGS__) { constexpr static char const* c_strFuncName = #x;
struct DEF_CLASS(Foo)
DEF_FUNC(Foo)
cout << MAGIC;
}
void DEF_FUNC(f)
cout << MAGIC;
}
};
答案 0 :(得分:0)
简单的答案是否定的。在代码之前评估宏 被解析,因此无法获得词汇上下文。至于 使用宏获取当前函数名称,该函数失败 几个计数:首先,返回当前函数的宏 name实际上扩展为生成的编译器的名称 包含名称的变量;第二,没有办法 无论如何要比较宏中的字符串;第三,除非你 想把它限制在一个构造函数中,你会用什么名字 无论如何要比较它?