зачем определять "SQLITE_EXTERN extern" - PullRequest
1 голос
/ 02 января 2012

В исходном коде sqlite вы можете видеть следующее определение:

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

Я не совсем уверен, в каком случае мы можем переопределить "extern", у вас есть какие-либо идеи?

Ответы [ 2 ]

1 голос
/ 02 января 2012

Мы говорим компилятору заменить все экземпляры SQLITE_EXTERN на ключевое слово "extern", когда он предварительно обрабатывает файлы. Следовательно, если вы включаете заголовок sql, который содержит объявление как показано ниже

SQLITE_EXTERN тип данных sql_variable;

компилятор обрабатывает ее как переменную "extern" и не выделяет память для переменной.

EDIT:

Чтобы добавить к этому, принято объявлять переменные с "extern" в заголовочных файлах и определять переменные в файле cpp. Определение переменных в заголовочных файлах без квалификатора "extern" выделит место для переменной везде, где включен заголовочный файл!

Переопределение экстерьера:

#define выше предоставляет вам возможность инициализировать переменные sql так, как вам нравится. Смотрите ссылку http://msdn.microsoft.com/en-us/library/w7wd1177(v=vs.71).aspx для более подробной информации об инициализаторах. В статье есть утверждение ->

Объявления автоматических, регистровых, статических и внешних переменных могут содержать инициализаторы. Однако объявления внешних переменных могут содержать инициализаторы, только если переменные не объявлены как extern.

Если вы как-то хотите переопределить внешнее объявление переменной sql и хотите инициализировать его самостоятельно, вы можете просто определить

#define SQLITE_EXTERN 

Одна из причин переопределения этого заключается в том, что Sqlite является кроссплатформенным (очень широко), некоторые из платформ могут не поддерживать хорошо ключевые слова extern, поэтому мы должны иметь гибкость, чтобы отключить это.

и инициализируйте переменные так, как вы хотите. Надеюсь, это поможет!

1 голос
/ 02 января 2012

Возможно, вы захотите переопределить определение, например, если вы хотите поместить библиотеку sqlite в dll (платформенно-зависимую), в этом случае extern станет __declspec(dllimport).

Один из возможных вариантовдело.Я думаю, что могут быть и другие.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...