为什么在全局范围内使用 "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
,并且一切正常。
- 初始化变量时不必重复
extern
关键字。该变量此时(在 .cpp 中)已称为 extern
,因为在包含 header. 时已经执行了声明
- 正如评论中提到的@Jarod42,你的常量声明和non-const初始化不匹配。
- 如果在声明变量时初始化
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
,并警告您信息存在冲突。
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
,并且一切正常。
- 初始化变量时不必重复
extern
关键字。该变量此时(在 .cpp 中)已称为extern
,因为在包含 header. 时已经执行了声明
- 正如评论中提到的@Jarod42,你的常量声明和non-const初始化不匹配。
- 如果在声明变量时初始化
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
,并警告您信息存在冲突。