我正在尝试编写一个健壮的宏,它可以在 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/

10-13 08:28