函数声明的含义

8

我一直在阅读 stdio.h 文件,但我感到困惑。

例如,有这样一行代码:

_CRTIMP FILE* __cdecl __MINGW_NOTHROW fopen (const char*, const char*);

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

# ifndef _CRTIMP
#  define _CRTIMP  __declspec(dllimport)
# endif

我不理解它,它的作用是什么?其他字符串(__cdecl__MINGW_NOTHROW)是什么意思?

4个回答

10

__declspec(dllimport) 表示该函数将从单独的dll中导入;根据CRT静态/动态链接设置的不同方式,它被定义为不同的形式。

__cdecl 是用于该函数的调用约定;调用约定告诉编译器函数希望如何调用(参数在堆栈上的顺序,任何寄存器是否用于参数,返回值存储在哪里,谁负责清理堆栈等等);通常情况下,只要您不编写库,就不需要担心它们。

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

请注意,所有这些都不是标准的C属性,而是特定于编译器/平台的东西。再次强调,在一般情况下,您不需要担心它们,它们是确保CRT正常工作所必需的,但只要您不构建库,就可以不知道它们的任何内容。 :)


5
你应该查看 _mingw.hgcc手册:对于支持 __GNUC__ 的gcc或任何其他编译器,以下定义适用:
#define __cdecl  __attribute__ ((__cdecl__))
#define __MINGW_NOTHROW __attribute__ ((__nothrow__))

前者告诉编译器使用cdecl x86调用约定(请参阅gcc手册),后者保证函数不会抛出C ++异常(请参阅gcc手册)。 __declspec(dllimport)是使动态链接工作的必要条件(请参阅gcc手册)。

1

__declspec(dllimport)告诉编译器该函数需要从DLL中导入,它是Windows特定的扩展。有关详细信息,请参见this page

同样,__cdecl是一个属性,指定该函数使用特定的调用约定(即C语言使用的约定)。请参见this page

我猜__MINGW_NOTHROW宏是GCC nothrow属性的同义词,它通知编译器所涉及的函数不能引发异常。有关详细信息,请参阅documentation


0

这些声明是针对您使用的环境或编译器特定的。

  • __declspec(dllimport) 表示在 Windows 上,此函数位于 DLL 中,并应放置在生成的可执行 PE 文件的导入表中。
  • __cdecl 表示标准 C 调用约定,并将修改编译器转换函数以符合此调用约定的方式。
  • __MINGW_NOTHROW 是特定于您的编译器的,可能会停用异常支持。

在所有情况下,您的编译器文档中必须有解释。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接