[英]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 };
之前和之后应该有#ifndef
和endif
const struct puppy fido = { "fido", 10, 10 };
为了包括一次。
一个好的做法 (通常必须避免全局变量)是在.h文件中用extern
声明,并将变量的定义放入.c文件中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.