Правильно ли использовать ключевое слово extern в & quot; extern int x & quot; в заголовке и источнике для глобальной переменной?

Существует одна переменная с именем BOT_TIME это зависит от сложности моей игры, и, следовательно, не const, Есть много файлов, которые используют его. Я намерен использовать его в качестве глобальной переменной.

1) В constants.h Я заявляю это extern int BOT_TIME,
В constants.cppЯ заявляю это extern int BOT_TIME,

BUILD => неопределенные ссылки на переменную во всех источниках (да, я включил заголовок).

2) В constants.h Я заявляю это int BOT_TIME,
В constants.cppЯ заявляю это int BOT_TIME,
поскольку non-consts по умолчанию extern Я решил оставить это ключевое слово.

BUILD => Множественное определение переменной (отображается в каждом исходном файле, в который включен constants.h)

3) В constants.h Я заявляю это extern int BOT_TIME,
В constants.cppЯ заявляю это int BOT_TIME,

Это работает.

Где проблема?

Инициализация переменной к чему-либо в constants.cpp заставляет это работать для случаев 1 и 3.

Что это происходит?
Какой правильный подход?

2

Решение

Вы можете объявлять переменную столько раз, сколько хотите, вы можете и должны определять ее только один раз.

extern int BOT_TIME;

это декларация.

int BOT_TIME;

это определение.

Определение должно появиться в одном файле реализации.

Поскольку non-consts по умолчанию являются extern, я решил оставить это ключевое слово.

Нету. Как ты понял?

Чтобы ответить на вопросы:

1) Там нет определения, только декларации.

2) Предположение неверно. Вы определяете символ несколько раз.

3) Это работает, потому что это правильный способ сделать это.

Из комментариев:

Когда вы объявляете переменную с externвы указываете, что он имеет внешнюю связь, да, но вы только объявляете, а не определяете его. Если вы оставите это без extern ключевое слово, оно все еще имеет внешнюю связь, но это также и определение.

3

Другие решения

Вам необходимо объявить переменную в заголовочном файле и определить ее один раз и только один раз в исходном файле.
Правильный способ сделать это:

constants.h

//declare the symbol as extern
extern int BOT_TIME;

constants.cpp

#include "constants.h"//define the symbol once and only once
int BOT_TIME;

XXXX.cpp

#include "constants.h"
//Include the header file which declares it extern in any source file
//you want to access it
//use BOT_TIME

Вы можете объявить переменную столько раз, но вы можете определить ее только один раз.
Если вы определяете переменную более одного раза, вы нарушаете Одно Правило Определения.

extern int BOT_TIME;

это декларация и #1 только делает одно и то же объявление дважды, это разрешено, но это не работает, так как вы никогда не определяете переменную. extern переменная должна быть определена один раз, или компилятор не может найти ее определение и, следовательно, жалуется.

В #2 Вы определяете один и тот же символ несколько раз в разных единицах перевода. Это нарушает правило одного определения и, следовательно, компоновщик сообщает об одном и том же.

#3 это правильный способ сделать это.

Хорошо для чтения:
В чем разница между определением и декларацией?

2

extern int x;     // declaration
int x;            // definition
extern int x = 3; // definition

В общем, вам нужно объявление в заголовочном файле, для исходных файлов, которые должны знать о x, Тебе нужно один определение, в одном исходном файле, так что на самом деле есть объект x,

0
По вопросам рекламы [email protected]