09C语言高级篇之头文件的编写

C语言高级篇之头文件的编写

1.extern理解

​ 1.extern,声明,当然也可以同时定义(一般没必要),函数可以省略,使用该关键字定义变量称做“外部变量声明”

​ 2.extern,不是定义,只有引用到时,会去找执行的函数或者具体值

​ C语言代码是由上到下依次执行的,不管是变量还是函数,原则上都要先定义再使用,否则就会报错。但在实际开发中,经常会在函数或变量定义之前就使用它们,这个时候就需要提前声明。所谓声明(Declaration),就是告诉编译器我要使用这个变量或函数,你现在没有找到它的定义不要紧,请不要报错,稍后我会把定义补上。

2.那些被编译器隐藏了的过程

预处理i文件(宏处理)->汇编0文件->out文件->exe文件

3.到底什么是链接,它起到了什么作用?

变量名、函数名等仅仅是地址的一种助记符,目的是在编程时更加方便地使用数据,当源文件被编译成可执行文件后,这些标识符都不存在了,它们被替换成了数据的地址。

4.强符号和弱符号

在C语言中,函数和初始化的全局变量(包括显示初始化为0)是强符号,未初始化的全局变量是弱符号。

对于它们,下列三条规则使用:

① 同名的强符号只能有一个,否则编译器报"重复定义"错误。

② 允许一个强符号和多个弱符号,但定义会选择强符号的。

③ 当有多个弱符号相同时,链接器选择最先出现那个,也就是与链接顺序有关。
我们经常在编程中碰到一种情况叫符号重复定义。多个目标文件中含有相同名字全局符号的定义,那么这些目标文件链接的时候将会出现符号重复定义的错误。比如我们在目标文件A和目标文件B都定义了一个全局整形变量global,并将它们都初始化,那么链接器将A和B进行链接时会报错:

1 b.o:(.data+0x0): multiple definition of `global’
2 a.o:(.data+0x0): first defined here

这种符号的定义可以被称为强符号(Strong Symbol)。有些符号的定义可以被称为弱符号(Weak Symbol)。对于C语言来说,编译器默认函数和初始化了的全局变量为强符号,未初始化的全局变量为弱符号(C++并没有将未初始化的全局符号视为弱符号)。我们也可以通过GCC的"attribute((weak))"来定义任何一个强符号为弱符号。注意,强符号和弱符号都是针对定义来说的,不是针对符号的引用。比如我们有下面这段程序:
原文链接:https://blog.csdn.net/astrotycoon/article/details/8008629

————————通过上面例子,我们知道,C/C++语言中,全局常量变量名最好只有一个,否则容易报错

————————多个函数名相同时,要保证参数类型和数量不同

5.C语言模块化编程中的头文件

.h 和 .c 在项目中承担的角色不一样:.c 文件主要负责实现,也就是定义函数和变量;.h 文件主要负责声明(包括变量声明和函数声明)、宏定义、类型定义等。这些不是C语法规定的内容,而是约定成俗的规范,或者说是长期形成的事实标准。

根据这份规范,头文件可以包含如下的内容:

  • 可以声明函数,但不可以定义函数。
  • 可以声明变量,但不可以定义变量。
  • 可以定义宏,包括带参的宏和不带参的宏。
  • 结构体的定义、自定义数据类型一般也放在头文件中。

在项目开发中,我们可以将一组相关的变量和函数定义在一个 .c 文件中,并用一个同名的 .h 文件(头文件)进行声明,其他模块如果需要使用某个变量或函数,那么引入这个头文件就可以。

6.细说C语言头文件的路径

#include "./../xyz.h",其中../表示上级目录。./../xyz.h的意思是,在当前目录的上级目录中查找 xyz.h 文件。

7.防止C语言头文件被重复包含

1) #pragma once用来防止某个头文件被多次include,

#pragma once是编译相关,就是说这个编译系统上能用,但在其他编译系统不一定可以,也就是说移植性差,不过现在基本上已经是每个编译器都有这个定义了。

2) #ifndef,#define,#endif用来防止某个宏被多次定义。

#ifndef,#define,#endif这个是C++语言相关,这是C++语言中的宏定义,通过宏定义避免文件多次编译。所以在所有支持C++语言的编译器上都是有效的,如果写的程序要跨平台,最好使用这种方式

8.C语言static变量和函数

与java是完全不同的,在C/C++语言中,static表达,只能在类内部使用。

外部变量定义在函数之外,因此可以在许多函数中使用。由于C语言不允许在一个函数中定义其它函数,因此函数本身只能是“外部的”。

因此,产生了,一些函数和变量,只想在内部使用的想法,由此static诞生

注意:

​ 1.在一个源程序所有源文件中,一个外部变量或函数只能在某个文件中定义一次,而其它文件可以通过extern声明来访问它。

​ 2.static则可以限定变量或函数为静态存储,所以,一开始该变量从程序一开始就拥有内存,不会随其所在函数的调用和退出而分配和消失

​ 3.static不会与其他文件同名文件有冲突,原因,static仅在内部使用。

​ 4.static只会定义一次,不会定义多次。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值