Почему «extern const int n» не работает должным образом?

Мой проект состоит только из двух исходных файлов:

a.cpp:

const int n = 8; 

b.cpp:

 extern const int n; int main() { // error LNK2001: unresolved external symbol "int const n" ([email protected]@3HB) int m = n; } 

Я знаю, что есть несколько способов заставить его работать; однако, мне просто интересно, почему это не работает?

Это потому, что const подразумевает внутреннюю связь по умолчанию, поэтому ваше «определение» не отображается вне единицы перевода, где оно появляется.

В этом случае лучшим решением является размещение объявления ( extern int const n; ) в файле заголовка и включение в оба a.cpp и b.cpp . Связь определяется первым объявлением, которое видит компилятор, поэтому более позднее определение в a.cpp будет иметь правильную (внешнюю) связь.

Кроме того, вы можете принудительно установить связь в определении:

 extern int const n = 8; 

Несмотря на extern , это все еще определение; что-либо с инициализатором вне определения classа является определением.

переменные const и constexpr в C ++ имеют внутреннюю связь (и, следовательно, недоступны в другой единице компиляции), если они также не объявлены extern (либо в определении, либо в предыдущем объявлении).

В C это не так (хорошо C не constexpr ), поэтому ваш код действителен, и вы можете поместить extern в определение.

Поэтому, если вы хотите написать код, который является как C, так и C ++ (и два объявления должны, вероятно, поступать из того же заголовка, что и Джеймс):

 // a.cpp extern const int n; const int n = 8; // b.cpp extern const int n; int main() { int m = n; } 

если вы не

 // a.cpp extern const int n = 8; 

также возможно

Объявите его extern в a.cpp и просто используйте без extern в b.cpp:

ах

 extern const int n ; 

a.cpp

 #include "ah" ... const int n= 8 

b.cpp:

 #include "ah" ... int main() { int m = n; } 

To share a const object among multiple files, you must define the variable as extern.

 To define a single instance of a const variable, we use the keyword extern on both its definition and declaration(s): 

Из этих правил вам просто нужно добавить ключевое слово extern в свое определение. вы уже имеете его в декларации.

Если другие ответы здесь не делают трюка, может быть, у вас есть свои определения в разных пространствах имен … если компиляция проходит, и вы получаете undefined symbol ошибку компоновщика undefined symbol :

  • проверьте пространство имен неопределенного символа; это эффективное пространство имен для extern const int n .
  • убедитесь, что это ваше эффективное пространство имен, где вы делаете определение const int n = 8 .
Давайте будем гением компьютера.