说有一个宏:
DeadlockThread for monitor Monitor1 and Monitor2: Running
DeadlockThread for monitor Monitor1 and Monitor2: Got lock for monitor 'Monitor1'
DeadlockThread for monitor Monitor1 and Monitor2: Waiting to get lock on 'Monitor2'
DeadlockThread for monitor Monitor2 and Monitor1: Running
DeadlockThread for monitor Monitor2 and Monitor1: Got lock for monitor 'Monitor2'
DeadlockThread for monitor Monitor2 and Monitor1: Waiting to get lock on 'Monitor1'
DeadlockThread for monitor Monitor1 and Monitor2: Try to get lock on 'Monitor2'
DeadlockThread for monitor Monitor2 and Monitor1: Try to get lock on 'Monitor1'
foo定义为:
#define X(...) foo(__VA_ARGS__)
我想检查是否在类中调用X.如果在类中调用它,那么我可以调用第二个版本void foo(int a) {}
template<class T>
void foo(int a, T& t) { std::cout<<a<<t.b; }
。否则,我将调用第一个版本而不传递foo(100,*this)
。
答案 0 :(得分:4)
严格来说,让宏观识别是否在某个类中调用它是不可能的。你看,宏是由预处理器扩展的 - 而不是由C ++编译器正确扩展;并且预处理器对C ++没有任何线索 - 它只适用于文本文件。当实际的编译器识别出类时,宏已经全部消失了。
但是,您可以使用更多宏来实现此目的:
#define IN_CLASS_FOO 1
class foo {
/* ... whatever ... */
}
#undef IN_CLASS_FOO
#define IN_CLASS_FOO 0
有了这个,您可以修改X
宏以使用IN_CLASS_FOO
来控制其行为。请注意,如果您展开一些引用this
变量的代码,即使您不在某个类中,也必须定义它,因此仍然无法使用它。
我强烈反对您不这样做,但是 - 您最有可能通过完全避免使用宏来提供更好的服务。尝试使用constexpr
function替换宏。
答案 1 :(得分:0)
问题中的信息太少,因此以下可以匹配或者可能不匹配......
class C
{
void foo(int a)
{
::foo(a, *this);
// ^^ resolves to global scope
bar::foo(a, *this);
// ^^ assuming foo resides in namespace "bar"
}
};
所以你现在有一个成员函数,只要你调用e就会被选中。 G。类上下文中的foo(77)
,否则,将选择free foo重载。宏没有意义,只需放弃它。
如果您可以将模板参数解析为类C
,即使从子类中调用,也可以从C
继承而不必重复此代码每个子类。否则,你将逃脱curiously recurring templates ......
答案 2 :(得分:0)
关键字 this
在任何非静态成员函数的主体中都可用。
有一次我在宏中看到一段很旧的代码,如下所示:
__if_exists(this) \
{ \
// Do something
} \
语句 __if_exists
在编译时检查标识符是否在此范围内可用。
但是要注意,只有MSVS支持,一般情况下,代码中使用这样的东西是不好的。