在sqlite的源代码中,您可以看到以下定义:
/*
** Add the ability to override 'extern'
*/
#ifndef SQLITE_EXTERN
# define SQLITE_EXTERN extern
#endif我不太确定在什么情况下我们可能想要覆盖"extern",你有什么想法吗?
发布于 2012-01-02 20:25:09
我们告诉编译器在预处理文件时,用"extern“关键字替换SQLITE_EXTERN的所有实例。因此,如果您包含一个sql标头,其中包含如下声明
SQLITE_EXTERN数据类型sql_variable;
编译器将其视为“外部”变量,并且不为该变量分配内存。
编辑:
除此之外,惯例是在头文件中使用"extern“声明变量,并在cpp文件中定义变量。在不带"extern“限定符的头文件中定义变量将为包含头文件的任何地方分配变量空间!
重写extern:
上面的#define为您提供了根据需要初始化sql变量的能力。有关初始化器的更多详细信息,请参阅链接http://msdn.microsoft.com/en-us/library/w7wd1177(v=vs.71).aspx。在文章->中有这样一句话
自动、寄存器、静态和外部变量的
声明可以包含初始值设定项。但是,仅当外部变量未声明为外部变量时,外部变量的声明才能包含初始值设定项。
如果您想要覆盖sql变量的外部声明,并希望自己对其进行初始化,则只需定义
#define SQLITE_EXTERN 覆盖它的一个原因是因为Sqlite是跨平台的(非常广泛),一些平台可能不能很好地支持外部关键字,因此我们需要灵活地禁用它。
并根据需要初始化变量。希望这能有所帮助!
发布于 2012-01-02 20:23:27
例如,如果您希望将sqlite库放入dll (特定于平台),那么extern将成为__declspec(dllimport),则可能需要覆盖该定义。
只有一个可能的案例。我猜可能还有其他的。
https://stackoverflow.com/questions/8700733
复制相似问题