为什么在从C ++中的其他文件中使用全局变量的前向声明而不是函数需要extern

问题描述

据我所知,默认情况下,全局非常数变量和函数都具有外部链接。因此,可以在向前声明的帮助下从其他文件中使用它们。例如:

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

但是,如果extern前没有int myNum;。这将发生:

duplicate symbol '_myNum' in:
    /path~~/main.o
    /path~~/other.o
ld: 1 duplicate symbol for architecture x86_64

所以我的问题是extern为何需要myNum?默认情况下,全局非常数变量不具有外部链接吗?

解决方法

因为两者之间存在差异

int getAnInt(); 

int getAnInt() { ... }

即括号本身,因此不需要像extern这样的标记来区分两者。

特别地,前者是一个声明,仅声明getAnInt存在并返回int等,而后者给出了其定义。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...