C语言——变量、函数、宏定义、结构体等声明和定义位置问题

一、变量

1、全局变量

1)位置问题

全局变量的位置:全局变量的定义和初始化放在c文件中,声明放在对应的h文件中。后果:定义在.h文件中,在链接的时候会报变量重复定义错误

2)声明与定义的区分

变量的声明有两种情况:
a.一种是需要建立存储空间的。例如:int a 在声明的时候就已经建立了存储空间。
b.一种是不需要建立存储空间的。 例如:extern int a 其中变量a是在别的文件中定义的。
把建立空间的声明成为“定义”,把不需要建立存储空间的成为“声明”。
基本类型变量的声明和定义(初始化)是同时产生的;而对于对象来说,声明和定义是分开的。
用static来声明一个变量的作用有二:
(1)对于局部变量用static声明,则是为该变量分配的空间在整个程序的执行期内都始终存在。
(2)外部变量用static来声明,则该变量的作用只限于本文件模块。

3)定义、声明与引用

方法一:在某个c文件里定义全局变量后,在其它c文件要用,则在该c文件里用extern进行声明。

   注意:定义全局变量的同时初始化变量;用extern进行声明时不能再初始化否则会报错。

方法二:在某个c文件中定义变量并初始化,然后再该c文件的h文件中用extern进行声明,此时不能再初始化。最后在需要使用该变量的其他c文件中包含前面的h文件。(移植性更好)

二、头文件

1、什么是头文件

头文件就是对用户的说明:函数,参数,各种各样的接口的说明——关于函数,变量,类的“声明”(对函数来说,也叫函数原型),而非定义。

2、头文件的包含

相应的c文件中包含所需的h文件。但千万不要将这些头文件全部放在c文件的相应头文件里。可以将c文件和h文件看作一个整体,移植时全部移走。

三、宏定义、结构体、typedef定义的位置问题

1、若结构体类型只需要在某个c文件中使用,那么就在相应c文件里定义该结构体即可。
2、若结构体类型要在多个c文件中使用,那么就应该在头文件中定义该结构体,再在要用它的文件中包含结构体定义所在的头文件即可。
(宏定义、结构体、typedef结论一样,放的位置相同)

四、extern的使用

1、对变量来说

   extern int a;//声明一个全局变量a
  int a; //定义一个全局变量a
  extern int a =0 ;//定义一个全局变量a 并给初值。
  int a =0;//定义一个全局变量a,并给初值

第三和第四都是定义一个可以被外部使用的全局变量,并给初值。但两者不能同时出现,不管是int a;还是extern int a=0;还是int a=0;都只能出现一次。定义只能出现一次,而那个extern int a可以出现很多次。

当引用一个全局变量的时候,就必须要声明,extern int a; 这时候extern不能省略,因为省略了,就变成int a;这是一个定义,不是声明。注:extern int a; 中类型int可省略,即extern a; 但其他类型则不能省略

2、对函数来说

定义的时候用extern,说明这个函数是可以被外部引用的,声明的时候用extern说明这是一个声明。 但由于函数的定义和声明是有区别的,定义函数要有函数体,声明函数没有函数体(且以分号结尾),所以函数定义和声明时都可以将extern省略掉。

3、总结

1、变量:
如果想在源文件A中使用源文件B的变量,方法有2种:
(1)在A文件中必须用extern声明在B文件中定义的变量(当然是全局变量);
(2)在A文件中添加B文件对应的头文件,且B头文件包含B文件中的变量声明,也即在这个头文件中必须用extern声明该变量,否则,该变量又被定义一次。
2、函数:
如果你想源文件A中使用源文件B的函数,方法有2种:
(1)在A文件中用extern声明在B文件中定义的函数(可省略extern,只需在A文件中出现B文件定义函数原型即可);
(2)在A文件中添加B文件对应的头文件,且B头文件包含B文件中的函数原型,在头文件中函数可以不用加extern。

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值