首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么要定义"SQLITE_EXTERN extern“

为什么要定义"SQLITE_EXTERN extern“
EN

Stack Overflow用户
提问于 2012-01-02 20:19:45
回答 2查看 283关注 0票数 1

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

代码语言:javascript
复制
/*
** Add the ability to override 'extern'
*/
#ifndef SQLITE_EXTERN
# define SQLITE_EXTERN extern
#endif

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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变量的外部声明,并希望自己对其进行初始化,则只需定义

代码语言:javascript
复制
#define SQLITE_EXTERN 

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

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

票数 1
EN

Stack Overflow用户

发布于 2012-01-02 20:23:27

例如,如果您希望将sqlite库放入dll (特定于平台),那么extern将成为__declspec(dllimport),则可能需要覆盖该定义。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8700733

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档