Extern 的问题在于不知道这个关键词出现的时候到底是声明还是定义。 谨记:声明可以多次,
定义只能一次。在使用中
,要形成一种风格。
函数的声明 extern 关键词是可有可无的, 因为函数本身不加修饰的话就是 extern 的。但
是引用的时候一样是需要声
明的。而全局变量在外部使用声明时, extern 关键词是必须的,如果变量无 extern 修饰且没
有显式的初始化,同样成为
变量的定义,因此此时必须加 extern,而编译器在此标记存储空间在执行时加载如内存并初
始化为 0。而局部变量的声
明不能有 extern 的修饰,且局部变量在运行时才在堆栈部分分配内存。
引用性声明、定义性声明
强符号、弱符号
出现在 linux 的 gcc 链接分析中,可以加深链接的理解。
全局变量或函数本质上讲没有区别, 函数名是指向函数二进制块开头处的指针。 而全局
变量是在函数外部声明的变
量。函数名也在函数外,因此函数也是全局的。
头文件
首先说下头文件,其实头文件对计算机而言没什么作用,她只是在预编译时在 #include
的地方展开一下,没别的意
义了,其实头文件主要是给别人看的。
我做过一个实验,将头文件的后缀改成 ,然后在引用该头文件的地方用
#include""
编译, 链接都很顺利的过去了, 由此可知,头文件仅仅为阅读代码作用,没其他的作用
了!
不管是 C 还是 C++ ,你把你的函数,变量或者结构体,类啥的放在你的 .c 或者 .cpp 文
件里。然后编译成
lib,dll,obj,.o 等等,然后别人用的时候最基本的 gcc |obj|dll|lib 等等。
但对于我们程序员而言, 他们怎么知道你的 lib,dll... 里面到底有什么东西?要看你的头
文件。你的头文件就是
对用户的说明。函数,参数,各种各样的接口的说明。
那既然是说明, 那么头文件里面放的自然就是关于函数, 变量, 类的“声明” 了。记着,
是“声明”,不是“定义
”。那么,我假设大家知道声明和定义的区别。所以,最好不要傻嘻嘻的在头文件里定义什
么东西。比如全局变量:
#ifndef _XX_ 头文件 .H
#define _XX_ 头文件 .H
int A;
#endif
那么,很糟糕的是,这里的 int A 是个全局变量的定义,所以如果这个头文件被多次引
用的话,你的 A 会被重复定义
。显然语法上错了。只不过有了这个 #ifndef 的条件编译,所以能保证你的头文件只被引用
一次,不过也许还是会岔子
,但若多个 c 文件包含这个头文件时还是会出错的,因为宏名有效范围仅限于本 c 源文件,
所以在这多个 c 文件编译时是
不会出错的,但在链接时就会报错,说你多处定义了同一个变量。
Linking...
: error LNK2005: "int glb" (?glb@***@3HA) already defined in
Debug/ : fatal error LNK1169: one or more multiply defined symbo
extern使用方法总结 来自淘豆网m.daumloan.com转载请标明出处.