我正在尝试编写一个健壮的宏,它可以在 thiscall 和 cdecl 调用约定中工作,但是如果存在“this”(thiscall),则使用“this”获取附加信息。
是否可以?
这是一个不起作用的例子:
#define PRINT_IF_THIS_EXISTS \
if (this) printf("this (addr %08x) exists in %s!\n", size_t(this), __FUNCTION__)
struct MyStruct
{
void MyFunc()
{
PRINT_IF_THIS_EXISTS;
}
};
void StaticFunc()
{
PRINT_IF_THIS_EXISTS;
MyStruct ms;
ms.MyFunc();
}
所需的运行时输出:
观察到的编译器错误:
我正在使用 clang 和 Visual Studio,让它单独工作仍然很有用。这似乎与 SFINAE 相似,但我没有发现任何与“this”相关的内容
最佳答案
你可能会想出更好的东西,但这可能会奏效。
在 MSVC++ 中测试。
#include <iostream>
#include <stdio.h>
#include <string.h>
#define PRINT_IF_THIS_EXISTS \
if (strchr(__FUNCTION__,':')) printf("this exists in %s!\n", __FUNCTION__)
class test
{
public:
test()
{
PRINT_IF_THIS_EXISTS;
}
};
void staticFunction()
{
PRINT_IF_THIS_EXISTS;
}
int main()
{
PRINT_IF_THIS_EXISTS;
staticFunction();
test t;
std::cin.get();
return 0;
}
关于c++ - 如果存在则使用它/检测 C++ 中当前范围的调用约定(thiscall vs cdecl),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31257801/