C语言笔记 -- 定义和声明

1、函数原型、函数声明、函数定义

函数原型: 声明了一个函数的名字、参数类型和个数、返回值类型。函数原型为编译器提供了有用的信息,编译器在翻译代码的过程中,只有见到函数原型(不管带不带函数体)之后才知道这个函数的名字、参数类型和返回值,这样碰到函数调用时才知道怎么生成相应的指令,所以函数原型必须出现在函数调用之前,这也是遵循“先声明后使用”的原则。

函数声明:在 函数原型 后面加;号结束,而不写函数体的是函数声明

函数定义:在函数原型后带函数体的就是函数定义。编译器只有见到函数定义才会生成指令,而指令在程序运行时要占存储空间。

 

如果函数调用出现函数原型的前面,编译器会根据函数调用代码做隐式声明。隐式声明存在的问题:

  1. 隐式声明的参数类型和参数个数可能跟函数原型不同。因为隐式声明是从函数调用代码推导而来的,而事实上函数定义的形参类型可能跟函数调用代码传的实参类型并不一致,如果函数定义带有可变参数(例如printf),那么从函数调用代码也看不出来这个函数带有可变参数。
  2. 隐式声明的返回值都是int型。从函数调用代码也看不出来返回值应该是什么类型,所以隐式声明只能规定返回值都是int型的。例如,函数原型 void push(char c) 的隐式声明 是 int push(char);

 

如果函数调用在一个模块中,而函数定义在另一个模块中,如果在函数调用前没有函数声明,编译器会报警:

 warning: implicit declaration of function 'XXX'

 

2、头文件

对于用角括号包含的头文件, gcc首先查找-I选项指定的目录,然后查找系统的头文件目录(通常是/usr/include);

对于用引号包含的头文件, gcc首先查找包含头文件的.c文件所在的目录,然后查找-I选项指定的目录,然后查找系统的头文件目录。

例如 编译选项-Istack 用-I选项告诉gcc到包含头文件的.c文件所在的目录的子目录stack里找要包含的头文件。

 

头文件里有些代码是不允许多次出现的,比如:typedef类型定义和结构体Tag定义等,在一个程序文件中只允许出现一次。

头文件中的变量和函数声明一定不能是定义。因为符号定义是强符号,而链接器不允许有多个同名的强符号。如果头文件中出现变量或函数定义,这个头文件又被多个.c文件包含,那么这些.c文件就不能链接在一起了。
 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值