关于c语言的头文件问题

来源:百度知道 编辑:UC知道 时间:2024/06/09 12:36:27
#if __STDC__
#define _Cdecl
#else
#define _Cdecl cdecl
#endif

我看基本上每个c头文件都有这段条件编译,其中-STDC-- -Cdecl 都是什么变量?

如果定义了__STDC__,就说明这个编译器遵循标准C。所以把_Cdecl定义为空字符串,也就是相当于把所有的_Cdecl删除了。
如果没有定义__STDC__,就是明这个编译器不遵循标准C。那么把_Cdecl定义为 cdecl。

其实cdecl可能也是一个宏,当编译器支持一个叫“调用约定”的扩展时,cdecl被定义成这种扩展的语法。
之所以有这段条件编译是因为标准C不支持“调用约定”。

__declspec一般是ms对标准c++语言的扩充指令.经典的象dllexport,property(get=...)等等.不想跨平台用用不错.

__cdecl,__stdcall是声明的函数调用协议.主要是传参和弹栈方面的不同.一般c++用的是__cdecl,windows里大都用的是__stdcall(API)

函数调用规范__cdecl和__stdcall的区别一目了然(表格形式) 转载- -
Tag: __cdecl __stdcall 区别
__cdecl

__stdcall

C和C++程序的缺省调用规范

为了使用这种调用规范,需要你明确的加上__stdcall(或WINAPI)文字。即return-type__stdcallfunction-name[(argument-list)]

在被调用函数(Callee)返回后,由调用者(Caller)调整堆栈。

调用者

// call function
// adjust stack

被调用函数
// do work
// return

在被调用函数(Callee)返回前,由被调用函数(Callee)调整堆栈。图示:

调用者

// call function

被调用函数
// do work
// adjust stack
// return

因为每个调用的地方都需要生成一段调整堆栈的