我的 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)
我正在使用 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)