为什么定义“SQLITE_EXTERN extern”

时间:2012-01-02 12:19:45

标签: c++ c sqlite

在sqlite的源代码中,您可以看到以下define:

/*
** Add the ability to override 'extern'
*/
#ifndef SQLITE_EXTERN
# define SQLITE_EXTERN extern
#endif

我不太确定在什么情况下我们可能想要覆盖“extern”,你有什么想法吗?

2 个答案:

答案 0 :(得分:1)

如果要将sqlite库放入dll(特定于平台),您可能希望覆盖define,在这种情况下,extern将成为__declspec(dllimport)

只是一个可能的案例。我猜可能还有其他人。

答案 1 :(得分:1)

我们告诉编译器在预处理文件时用“extern”关键字替换所有SQLITE_EXTERN实例。因此,如果您包含一个sql标头,其中包含一个声明如下

SQLITE_EXTERN数据类型sql_variable;

编译器将其视为“extern”变量,并且不为变量分配内存。

编辑:

除此之外,在头文件中使用“extern”声明变量并在cpp文件中定义变量是一种惯例。在没有“extern”限定符的头文件中定义变量会为包含头文件的变量分配空间!

覆盖extern:

上面的#define提供了一个初始化sql变量的能力。有关初始值设定项的详细信息,请参阅链接http://msdn.microsoft.com/en-us/library/w7wd1177(v=vs.71).aspx。文章中有一条声明 - >

  

自动,寄存器,静态和外部变量的声明可以包含初始值设定项。但是,只有在变量未声明为extern时,外部变量的声明才能包含初始值。

如果你想以某种方式覆盖sql变量的外部声明,并希望自己初始化它,你可以只定义

#define SQLITE_EXTERN 

重写这一点的一个原因是因为Sqlite是跨平台的(非常广泛),某些平台可能不能很好地支持extern关键字,因此我们需要灵活地禁用它。

并根据需要初始化变量。希望这有帮助!