头文件中只能声明变量不能定义变量 而声明变量必须带extern,为什么头文件中变量的声明都没有加

1.头文件中不可以放变量的定义!一般头文件中只是放变量的声明,因为头文件要被其他文件包含#include,如果把定义放在头文件的话,就不能避免多次定义变量。C++不允许多次定义变量,一个程序中对指定变量的定义只有一次,声明可以无数次。
三个例外:
1)值在编译时就已知的const变量的定义可放在头文件中,如:const int num=10;
2)类的定义可放在头文件中。
3)inline函数。

2.定义和声明是不同的。定义只能出现一次,而声明可以出现多次。
下面的语句是定义,不能放在头文件中:
extern int ival=10; //虽然ival声明为extern,但是它初始化了,代表这是个定义。
double fica_rate; //fica_rate虽然没有初始化,但是没有extern。所以仍是定义。

3.在多个C文件的程序中,想在头文件中声明定义几个变量,如果给声明的变量赋值,则提示重复定义,在声明的变量前加extern只对变量进行声明,可是在什么地方给变量赋值呢??
答:加了extern后,就可以在其他任何引用此文件的地方来进行赋值的。比如说,可在主文件中进行赋值。

4.extern int x; //变量是声明,并未实际分配地址。
void print(); //函数声明,并未产生实际目标代码
如:int x; void print() { }; //均为定义。

5.只有全局变量并且没有被static声明的变量才能声明为extern。所以,如果你不想自己源文件中全局变量被其他文件引用,你就可以给变量加上static声明。
定义也是声明。C++中有个关键字用来声明变量的,即extern。它声明一个变量,而不定义它。
注意:在C++中,变量有且只能有一次定义,但是可以声明多次。
举例说明:假设在文件1.cpp中定义了一个全局变量bufsize,文件1.cpp中当然能访问它,如果我想在文件2.cpp中访问这个全局变量,这时候需要在文件2.cpp中声明这个变量。
//1.cpp
int bufsize;
//2.cpp
extern int bufsize;
这里说的是非const的全局变量,如果是const的全局变量,如果想被其他文件访问,需要在定义时,加上extern关键字,表示它可被其他文件声明使用的。否则的话,这个变量只能在它被定义的文件里面被访问,其他文件不能访问。
//1.cpp
extern const int bufsize=10;
//2.cpp
extern const int bufsize;
为什么非const变量定义时候没有extern??答:非const变量默认为extern,const变量默认为文件的局部变量。而const变量如果想在其他文件里被访问,必须显示的指定它为extern。标题答案在这里

6.C++标准并没有规定头文件中不能定义变量,只不过如果在头文件中定义变量,而该头文件又被多次包含的话,会造成变量的重新定义。

7.例如:在test.c文件中定义变量int global=0;
可以在头文件test.h中声明这个变量为extern int global;
要使用这个变量的其他文件,只要包含test.h就可以了。

8.static全局变量是有文件作用域的。在a.c中用了,在其他文件中就不能使用了。static变量一般放在.cpp或者.c文件中。不放在.h文件中。

9.在某一个.c文件中定义:int num=0;
在.h文件中声明:extern int num;

10.#ifndef、、、#define、、、#endif
可以保证在一个文件里只是定义一次。
比如:a.h引用b.h, c.cpp同时引用a.h和b.h。这样,#ifndef、、、#define、、、#endif可以保证c.cpp里的b.h只被引用一次。

注意:要把头文件的内容都放在#ifndef和#endif中。不管头文件会不会被多个文件引用,都要加上这个。
一般的格式:
#ifndef <标识>
#define <标识>
、、、、
、、、、
#endif
<标识>理论上说可以自由命名。但是每个头文件的这个“标识”都应该是唯一的。标识的命名规则一般是头文件名全大写,前后加下划线,并把文件名中.也变成下划线。如:stdio.h
#ifndef STDIO_H
#define STDIO_H
、、、
#endif

链接地址

  • 6
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值