Почему это не подходит для использования «extern int a» в глобальной области видимости? - PullRequest
1 голос
/ 27 февраля 2020

main. cpp

#include <iostream>
#include "test.h"
int a = 999;
int main() {
    std::cout << a << std::endl;
    printa();

    return 0;
}

test.h

#include <iostream>
extern const int a;
void printa(void) {
    std::cout << a << std::endl;
}

При компиляции и запуске работает нормально

Но когда я изменил main. cpp на

#include <iostream>
#include "test.h"
extern int a = 999; //here is the change, I have added extern
int main() {
    std::cout << a << std::endl;
    printa();

    return 0;
}

Работает хорошо, но появляется предупреждение.

предупреждение: инициализировано и объявлено

Что не так? Почему использование "extern int a" в глобальной области видимости не подходит?

Ответы [ 2 ]

2 голосов
/ 27 февраля 2020

Что не так?

Не неправильно per se (следовательно, предупреждение, а не ошибка). Но вы предоставляете компилятору противоречивую информацию:

extern сообщает компилятору: «это определено в другом месте, пусть компоновщик обрабатывает его».

= 999 сообщает компилятору «это (определяется и) инициализируется прямо здесь, чтобы иметь значение 999 ".

Компилятор фактически игнорирует extern на этом этапе и предупреждает вас о том факте, что информация конфликтовала.

1 голос
/ 27 февраля 2020

Почему использование "extern int a" в глобальной области видимости не подходит?

На самом деле это "ОК" . В вашем заголовке ваша переменная объявлена ​​extern в глобальной области видимости, и с ней все в порядке.

  1. Вам не нужно повторять ключевое слово extern, если вы хотите инициализировать переменную , На данный момент переменная известна как extern (в. cpp), поскольку объявление уже выполнено при включении заголовка.
  2. As @ Jarod42 упомянутое в комментарии, ваше объявление const и несоответствие неконстантной инициализации.
  3. Если вы инициализируете переменную extern при объявлении, тогда extern устареет. Семанти c из extern - «Хорошо, я отложил инициализацию где-то еще». Отсюда и предупреждение.

Например:

.h

extern int a;       // declaration, as extern (will be initialized somewhere else)
extern const int b; // example with const

. cpp

int a = 42;         // initialization
const int b = 4422; // initialization
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...