SQLite中的源代碼,你可以看到如下定義:爲什麼定義「SQLITE_EXTERN外部」
/*
** Add the ability to override 'extern'
*/
#ifndef SQLITE_EXTERN
# define SQLITE_EXTERN extern
#endif
我不是在什麼情況下,我們可能要重寫「外部」相當肯定,你有什麼想法?
SQLite中的源代碼,你可以看到如下定義:爲什麼定義「SQLITE_EXTERN外部」
/*
** Add the ability to override 'extern'
*/
#ifndef SQLITE_EXTERN
# define SQLITE_EXTERN extern
#endif
我不是在什麼情況下,我們可能要重寫「外部」相當肯定,你有什麼想法?
我們告訴編譯器在預處理文件時用「extern」關鍵字替換SQLITE_EXTERN的所有實例。因此,如果你包含一個包含如下聲明的sql頭部
SQLITE_EXTERN datatype sql_variable;
編譯器將其視爲「extern」變量,並且不爲該變量分配內存。
編輯:
要補充的,它是在頭文件和定義在cpp文件變量「外部」來聲明變量的約定。在沒有「extern」限定符的頭文件中定義變量會爲包含頭文件的變量分配空間!
重寫EXTERN:
#定義上面提供的能力,爲您初始化SQL變量,只要你喜歡。有關初始值設定項的更多詳細信息,請參閱鏈接http://msdn.microsoft.com/en-us/library/w7wd1177(v=vs.71).aspx。文章中有一條語句 - >
自動,寄存器,靜態和外部變量的聲明可以包含初始值設定項。但是,只有當變量未聲明爲extern時,外部變量的聲明才能包含初始值。
如果你以某種方式要覆蓋一個SQL變量的外部聲明,並希望來初始化它,你可以只定義
#define SQLITE_EXTERN
一個原因來覆蓋,這是因爲SQLite是跨平臺(非常廣泛),一些平臺可能不會很好地支持extern關鍵字,因此我們需要靈活地禁用此功能。
並根據需要初始化變量。希望這可以幫助!
如果你想將sqlite庫放入dll(特定於平臺),你可能想重寫定義,例如extern
將變成__declspec(dllimport)
。
只是一種可能的情況。我想也可能有其他人。
你有沒有在你的項目中使用這個技巧,或者你有沒有使用過這個開源項目? – 2012-01-02 12:32:23
如果將extern更改爲__declspec(dllimport),則可能會從dll外的代碼引用,但對於dll內的代碼,因爲您刪除了extern,則會出現問題。 – 2012-01-02 12:39:43
好的,它會導致某種令人討厭的#ifdef /#else /#etcpp狂歡,通常會將其放置在某些* conf.h文件(例如,zlib示例的zconf.h)中。我從來沒有說過它會是很好的代碼,但:-) – 2012-01-02 12:43:50
當然,但問題是爲什麼我們需要這個額外的定義,因爲評論說它要添加覆蓋「extern」的能力,我們什麼時候要重寫? – 2012-01-02 12:29:45
謝謝Chethan,但我擔心你編輯也不回答問題。你在談論「extern」的用法。 – 2012-01-02 12:34:15
@baiyanhuang - 每當我們*不需要'extern',或者當我們需要一些額外的系統特定說明符。 :-) – 2012-01-02 12:36:16