如果文件范围声明默认具有外部链接,为什么我们需要C中的'extern'关键字?

14 c

AFAIK,文件范围内的变量或函数的任何声明都默认具有外部链接.static意思是"它有内部联系",extern- "它可能在其他地方定义",而不是"它有外部联系".

如果是,为什么我们需要extern关键字?换句话说,int foo;extern int foo;(文件范围)之间的区别是什么?

das*_*ght 29

extern关键字主要用于变量声明.当您转发声明一个函数时,该关键字是可选的.

该关键字使编译器可以区分全局变量的前向声明和变量的定义:

extern double xyz; // Declares xyz without defining it
Run Code Online (Sandbox Code Playgroud)

如果您自己保留此声明然后xyz在代码中使用,则会在链接阶段触发"未定义的符号"错误.

double xyz; // Declares and defines xyz
Run Code Online (Sandbox Code Playgroud)

如果将此声明保留在头文件中并从多个C/C++文件中使用它,则会在链接阶段触发"多个定义"错误.

解决方案是extern在标头中使用,而不是在一个C或C++文件中使用extern.