为什么在 C++ 中从其他文件使用全局变量的前向声明而不是函数时需要 extern
Why is extern required for forward declaration of global variables but not for functions when using them from other files in C++
据我所知,全局非常量变量和函数默认都具有外部链接。因此它们可以在前向声明的帮助下从其他文件中使用。例如:
int myNum{888};
int getAnInt()
{
return 999;
}
#include <iostream>
extern int myNum; // "extern" keyword is required.
int getAnInt(); // "extern" keyword is NOT required.
int main()
{
std::cout << getAnInt() << "\n";
std::cout << myNum << "\n";
}
但是,如果int myNum;
之前没有extern
。这将发生:
duplicate symbol '_myNum' in:
/path~~/main.o
/path~~/other.o
ld: 1 duplicate symbol for architecture x86_64
所以我的问题是为什么 myNum
需要 extern
?全局非常量变量不是默认有外部链接吗?
因为有区别
int getAnInt();
和
int getAnInt() { ... }
即括号本身,因此不需要像 extern
这样的标记来区分两者。
特别地,前者是一个声明,它只是声明 getAnInt
存在和 returns 一个 int
等,而后者给出了它的定义。
据我所知,全局非常量变量和函数默认都具有外部链接。因此它们可以在前向声明的帮助下从其他文件中使用。例如:
int myNum{888};
int getAnInt()
{
return 999;
}
#include <iostream>
extern int myNum; // "extern" keyword is required.
int getAnInt(); // "extern" keyword is NOT required.
int main()
{
std::cout << getAnInt() << "\n";
std::cout << myNum << "\n";
}
但是,如果int myNum;
之前没有extern
。这将发生:
duplicate symbol '_myNum' in:
/path~~/main.o
/path~~/other.o
ld: 1 duplicate symbol for architecture x86_64
所以我的问题是为什么 myNum
需要 extern
?全局非常量变量不是默认有外部链接吗?
因为有区别
int getAnInt();
和
int getAnInt() { ... }
即括号本身,因此不需要像 extern
这样的标记来区分两者。
特别地,前者是一个声明,它只是声明 getAnInt
存在和 returns 一个 int
等,而后者给出了它的定义。