与C函数定义一起使用的预处理程序宏定义

时间:2015-09-25 03:05:37

标签: c sqlite function c-preprocessor

我正在研究SQLite源代码(在c中),但有些事情我无法弄清楚它们是什么,我希望你能帮我一臂之力。 我知道c,c ++和JAVA基础知识,但我从未见过这样的东西,我也不知道如何搜索它。

在c文件中,有下一个定义(以及其他定义):

#ifndef SQLITE_CDECL
# define SQLITE_CDECL
#endif
#ifndef SQLITE_API
# define SQLITE_API
#endif

然后使用以下定义:

SQLITE_API int SQLITE_CDECL sqlite3_conf(int, ...){
  //code

我知道" SQLITE_API"和" SQLITE_CDECL"不是返回类型,函数名称,关键字,K& R样式,也不是变量修饰符......

为什么这个单词放在函数中?它们用于什么?

2 个答案:

答案 0 :(得分:2)

他们习惯于在不同平台上或在构建某些方式时修改功能的属性。大多数情况下可能不需要它们,但在某些情况下它们可能是有用的,例如,在构建DLL时使用__declspec(dllexport)或在直接包含文件时使用static而不是让链接器在目标文件之间执行链接。

答案 1 :(得分:0)

这两个声明看起来像是存在的,因此可以对它们进行不同的定义,以支持Windows上的某些开发怪癖。请注意,在#define行上,它们未定义为任何值。这意味着它们将被解析器看到的任何内容替换。因此,SQLITE_API int SQLITE_CDECL sqlite3_conf(int, ...){将在预处理器运行后最终减少到int sqlite3_conf(int, ...){。在Windows上,可以对它们进行不同的定义,以支持使用__declspec构建DLL(请参阅https://msdn.microsoft.com/en-us/library/dabb5z75.aspx)并指定调用约定(请参阅https://msdn.microsoft.com/en-us/library/zkwh89ks.aspx)。