繁体   English   中英

在与定义相同的文件中使用extern声明的好处?

[英]Benefits of using extern declaration in same file as definition?

我正在阅读C项目的源代码,并试图辨别为什么要使用extern的特定用法。 (注意: 这个问题是相关的,但对于C ++,不是C。)说我有四个头文件,每个头文件都声明一个extern const结构:

extern const struct puppy fido;

该结构在源文件中定义如下:

extern const struct puppy fido;
static const struct puppy *puppies[] = { &fido };
const struct puppy fido = { "fido", 10, 10 };

当在相同的源文件中定义变量声明时,在源文件中将变量声明标记为extern有什么好处?

唯一的好处是,声明和定义之间的任何代码都将能够访问该变量。 除此之外,同一文件中的extern声明毫无意义。

Lundin是正确的,在这种情况下, extern不会影响fido在其他源文件中的可见性。 在示例代码中,它用作前向声明。

C99标准第6.2.2节的相关部分:

4)对于在可见该标识符的先前声明的范围内用存储类说明符extern声明的标识符,如果该先前声明指定了内部或外部链接,则该标识符在后面的声明中的链接与先前声明中指定的链接。 如果没有在先声明可见,或者在先声明没有指定链接,则标识符具有外部链接。

5) 如果函数标识符的声明没有存储类说明符,则将其链接确定为与使用存储类说明符extern声明的完全相同。 如果对象的标识符声明具有文件范围且没有存储类说明符,则其链接是外部的

在C ++中,行为会有所不同,因为用const声明的变量是隐式static 在C ++中,您需要在第一次使用extern声明变量,否则其他编译单元将找不到它。

C ++ 98标准第3.5.3节:

具有名称空间范围(3.3.5)的名称如果具有以下名称,则具有内部链接:

—明确声明为静态的对象,引用,函数或函数模板,或者,

—一个对象或引用,该对象或引用被显式声明为const,并且既未显式声明为extern,也未先前声明为具有外部链接;

有时,当您编写源文件时,您只需要一个头文件,而不是整个文件。

在源文件中重复extern声明,可以使您不将头文件包括在该特定源文件中。

这不一定是一个好习惯。

extern const struct puppy fido;
// ...
const struct puppy fido = { "fido", 10, 10 };

如果const struct puppy fido = { "fido", 10, 10 }; 在2个不同的.c文件中编译,它将失败。 const struct puppy fido = { "fido", 10, 10 };之前和之后应该有#ifndefendif const struct puppy fido = { "fido", 10, 10 }; 为了包括一次。

一个好的做法 (通常必须避免全局变量)是在.h文件中用extern声明,并将变量的定义放入.c文件中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM