功能声明的含义

Buk*_*ksy 7 c function definition

我一直在阅读stdio.h文件,我很困惑.

例如,有这一行:

_CRTIMP FILE* __cdecl __MINGW_NOTHROW fopen (const char*, const char*);
Run Code Online (Sandbox Code Playgroud)

我知道"FILE*"表示返回类型,我发现_CRTIMP是常量定义为

# ifndef _CRTIMP
#  define _CRTIMP  __declspec(dllimport)
# endif
Run Code Online (Sandbox Code Playgroud)

但无论如何我也不明白,那是什么?什么是其余的字符串(__ cdecl,__ MINGW_NOTHROW)?

Mat*_*lia 6

__declspec(dllimport)指定该函数将从单独的dll导入; 我想,根据CRT静态/动态链接设置,它以不同的方式定义.

__cdecl是用于函数的调用约定; 调用约定告诉编译器函数如何被调用(在哪个顺序参数被推入堆栈,如果任何寄存器用于参数,存储返回值,谁负责堆栈清理,... ); 一般来说,只要你不写库就不用担心.

__MINGW_NOTHROW#defined扩展为__attribute__ ((__nothrow__)),这是一个MinGW特定的扩展,告诉编译器该函数不会抛出异常; 这使编译器可以执行一些优化.

请注意,所有这些都不是标准C属性,而是编译器/平台特定的东西.同样,一般来说你不应该担心它们,它们需要使CRT工作正常,但只要你不构建库,你就可以在不知道它们的情况下逃脱.:)


Chr*_*oph 5

您应该查看_mingw.hgcc手册:如果是gcc - 或任何其他编译器支持__GNUC__- 以下定义适用:

#define __cdecl  __attribute__ ((__cdecl__))
#define __MINGW_NOTHROW __attribute__ ((__nothrow__))
Run Code Online (Sandbox Code Playgroud)

前者告诉编译器使用cdecl x86调用约定(参见gcc手册),后者保证函数不会抛出C++异常(参见gcc手册).

__declspec(dllimport)有必要进行动态链接工作(参见gcc手册).