Подтвердить что ты не робот

Почему "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; 
}

Я знаю, что есть несколько способов заставить его работать; однако, мне просто интересно, ПОЧЕМУ он не работает?

4b9b3361

Ответ 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.