为什么在全局范围内使用 "extern int a" 似乎不可行?

Why does it seem not OK to using "extern int a" in global scope?

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;
}

工作正常,但出现警告。

warning: a initialized and declared

怎么了? 为什么在全局范围内使用 "extern int a" 似乎不合适?

Why does it seem not OK to using "extern int a" in global scope ?

其实是"OK"。在您的 header 中,您的变量在全局范围内声明为 extern,并且一切正常。

  1. 初始化变量时不必重复extern关键字。该变量此时(在 .cpp 中)已称为 extern,因为在包含 header.
  2. 时已经执行了声明
  3. 正如评论中提到的@Jarod42,你的常量声明和non-const初始化不匹配。
  4. 如果在声明变量时初始化 extern 变量,则 extern 会过时。 extern 的语义是 "Ok, I defer the initialization somewhere else"。因此警告。

例如:

.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

What is wrong?

没有错本身(因此是警告,不是错误)。但是您给编译器提供了相互矛盾的信息:

extern 告诉编译器,"this is defined elsewhere, let the linker handle it".

= 999 告诉编译器,"this is (defined and) initialized right here to have the value 999".

此时编译器实际上忽略了 extern,并警告您信息存在冲突。