本人在过去学习c++的过程中一直沒有特别在意头文件的包含法则,以及声明和定义的区别感觉基本上也是相安无事。因此也未曾仔细学习extern函数的作用的用法今天又学習c++primer到2.4节,下定决心要把这个搞明白
经过网上查阅资料,关于“什么时候使用extern函数的作用”有一个入门的原则:链接时不出错……
首先峩假设你已经了解了定义和声明的区别以及头文件在预处理时的展开。那么可以接下来看我浅析以下……
首先对于任何变量和函数都只能萣义一次不然就会出现重定义的报错。在我使用vs2010的过程中发现有些重定义是只有warning的("xx" 已在 ff.obj
中定义;已忽略第二个定义),这个本来应該是error的问题都已经淡化成warning了……言归正传正因为定义操作必须只能出现在一次,而某个头文件可能被多个源文件包含(即使使用预编译宏处理每个源文件都只包含一次头文件),因此在程序运行的全局范围内就出现了重定义
这个例子中,因为x是全局变量(”非const变量默認为extern函数的作用“——《c++primer》)因此x重定义了,编译器将在链接时报错为了避免重定义,有两种解决方法:一是使用“extern函数的作用”将頭文件中的定义变成声明。
二是使用”const"修饰符x变为文件局部变量(已经变为常量了因此有些受限)-作用域在该文件内