Почему "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;
}
Я знаю, что есть несколько способов заставить его работать; однако, мне просто интересно, ПОЧЕМУ он не работает?
Ответы
Ответ 1
Это потому, что const
подразумевает внутреннюю привязку по умолчанию, поэтому
ваше "определение" не видно за пределами единицы перевода
где он появляется.
В этом случае, безусловно, лучшим решением будет поставить декларацию
(extern int const n;
) в файле заголовка и включите в
как a.cpp
и b.cpp
. Связь определяется
первое объявление, которое компилятор видит, поэтому более позднее определение в
a.cpp
будет иметь правильную (внешнюю) связь.
В качестве альтернативы вы можете принудительно установить привязку в определении:
extern int const n = 8;
Несмотря на extern
, это все еще определение; ничего с
инициализатором вне определения класса является определение.
Ответ 2
const
и constexpr
переменные в С++ имеют внутреннюю связь (и, следовательно, недоступны в другой единице компиляции), если они также не объявлены extern
(либо в определении, либо в предыдущем объявлении).
В C это не так (ну C не имеет constexpr
), поэтому ваш код действителен, и вы можете поместить extern
в определение.
Итак, если вы хотите написать код, который является как 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;
также возможно
Ответ 3
Объявите его extern в a.cpp и просто используйте без extern в b.cpp:
хиджры
extern const int n ;
a.cpp
#include "a.h"
...
const int n= 8
b.cpp:
#include "a.h"
...
int main()
{
int m = n;
}
Ответ 4
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
в ваше определение. вы уже имеете его в декларации.
Ответ 5
Если другие ответы здесь не подходят, возможно, у вас есть свои определения в разных пространствах имен... если компиляция проходит, и вы получаете ошибку компоновщика undefined symbol
:
- проверить пространство имен символа undefined; что эффективное пространство имен для объявления
extern const int n
.
- убедитесь, что ваше эффективное пространство имен, где вы делаете определение
const int n = 8
.