为什么在 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 等,而后者给出了它的定义。