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

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

本文关键字:int extern 全局 范围内 为什么      更新时间:2023-10-16

main.cpp

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

测试.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"似乎不合适

怎么了?

没有错本身(因此是警告,而不是错误(。但是你给编译器的信息有冲突:

extern告诉编译器,"这是在其他地方定义的,让链接器处理它"。

= 999告诉编译器,"它在这里被(定义和(初始化为具有值999"。

编译器在这一点上有效地忽略了extern,并警告您信息存在冲突。

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

实际上是"OK">。在您的头中,您的变量在全局范围内声明为extern,并且一切都很好。

  1. 当您想要初始化变量时,不必重复extern关键字。此时(在.cpp中(该变量已被称为extern,因为在包含标头时已经执行了声明
  2. 正如评论中提到的@Jarod42,您的常量声明和非常量初始化不匹配
  3. 如果在声明extern变量时对其进行初始化,则extern将过时。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