我的 C++ 代码中的“#define __cdecl”是什么意思?

what's the meaning of "#define __cdecl" in my C++ code?

我正在使用 visual studio 处理现有的 c++ 项目,我发现几乎每个函数声明在函数名称前面都有一个 __cdecl,例如:void __cdecl functionName().然后我跳转到 __cdecl 的定义,它位于 winnt.h 文件中:

#if (_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED)
#define NTAPI __stdcall
#else
#define _cdecl
#define __cdecl
#define NTAPI
#endif

我搜索了 cdecl,发现它是 C 和 C++ 程序的默认调用约定,但上面的代码告诉我 __cdecl 没有扩展。那么为什么要在函数名前放置一个 __cdecl 呢,因为它什么都不是?还是我误解了上面的代码?

what's the meaning of #define __cdecl”

# 开头的行是预处理器指令。 #define 是定义预处理器宏的指令。 #define __cdecl 定义了一个带有标识符 __cdecl 和空替换的宏。如果定义了这样的宏,处理器将用空字符串替换 __cdecl 的所有实例。

So why place a __cdecl before function name as it's just nothing ?

查看相关定义开头的指令:

#if (_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED)
#else

宏是有条件地定义的。当宏没有定义时,__cdecl不会展开为空。当没有展开时,__cdecl 是您发现的 Microsoft 特定函数说明符。

条件定义的宏允许在允许的系统上编写使用 __cdecl 的代码,并在不允许的系统上自动删除它。

But I'm still confused with the #if (_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED) line, what does it mean?

这是一个预处理器指令,用于测试宏 _MSC_VER 的值是否大于 800,或者是否定义了宏 _STDCALL_SUPPORTED。如果测试为假,则删除#if 和#else 之间的代码。如果为真,则删除#else 和#endif 之间的代码。

这意味着如果 API 被定义为使用 NTAPI 它将生成使用 __stdcall 调用约定的代码 - Pascal 调用约定的变体,其中被调用者清理堆栈。使用 __cdecl,调用者清理堆栈(因此它支持可变类型函数)。

而这一切的前提是#if (_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED)