当前位置:网站首页>C专家编程 第8章 为什么程序员无法分清万圣节和圣诞节 8.4 原型之痛
C专家编程 第8章 为什么程序员无法分清万圣节和圣诞节 8.4 原型之痛
2022-08-07 14:34:00 【weixin_客子光阴】
原型之痛
ANSI C函数原型的目的是使C语言称为一种更加可靠的语言。建立原型就是为了消除一种普通(但很难发现)的错误,即形参和实参之间类型不匹配。
ANSI C的函数原型就是采取一种新的函数声明形式,把参数的类型也包含在声明之中。函数的定义也做了相应的改变以匹配声明。这样,编译器就可以在函数的声明和使用之间进行检查。
K&R C的函数声明与ANSI C原型的对比
//声明 K&R C //原型 ANSI
int foo(); int foo(int a, int b);
或
int foo(int, int);
//定义 K&R C //定义 ANSI C
int foo(a, b) int foo(int a, int b) {
int a, b;{...} ...
}
可以在ANSI C中使用int foo(void);这样的形式来表示“没有参数”,尽管它看上去与传统的C不一样。
函数原型不仅改变了C语言的语法,而且引入了一种微妙的语义区别(不是人们所希望的),K&R C函数参数会进行类型提升。在被调用函数的函数体内,这些值会根据函数定义使参数的声明类型自动裁剪为该类型。之所以要这么做,原因是为了简化编译器---所有的东西都是同一长度。如果只固定使用几种类型,将大大简化参数的传递,尤其是在非常老式的K&R C编译器中(不能传递struct作为参数)。这种 编译器只允许3中类型作为参数:int、double和指针。所有的参数都统一为标准长度,被调用函数会根据需要对它们进行裁剪。
相反,如果使用了函数原型,缺省参数提升就不会发生。编译器就会假定参数是准确声明的,于是便不进行类型提升,并据此产生代码。
边栏推荐
- dotnet 获取当前进程方法
- Visual studio 创建项目失败vstemplate
- 【vscode代码片段增加和删除】
- MySQL:使用自定义函数计算经纬度之间的最短距离
- 一个程序从编译到运行的全过程
- Network Foundation (3) 02-Basic Concept of Network - DNS server hosts file configuration & three-way handshake of website access process & BS architecture - browser access, CS architecture - installat
- 雷达的分辨率
- Research on the relationship between Yun and Enmo on "HTAP" and "Intelligent Warehouse Lake"
- 关于LANC控制镜头中出现的问题
- QT—状态机框架
猜你喜欢
随机推荐
08.v-for中遍历数据的几种方式
HJ4 字符串分隔
Introduction to common methods and principles of Lombok
实战 || 某软件股份有限公司通用漏洞挖掘
使用cephadm部署单节点ceph集群,后期可扩容(基于官方文档,靠谱,读起来舒服)
国内软件测试岗,可以卷到什么程度?
桥接模式:Swift 实现
处理乱码的问题oracle字符集WE8MSWIN1252和WE8ISO8859P1
004_Eureka注册中心
Postgresql logical backup tool pg_dump and pg_resotre learning
How about Qiniu's CITIC Securities VIP commission account?Is it safe and reliable?
A character occurrences HJ2 calculation
HJ3 明明的随机数
Fiddler breakpoint graphic explanation
Visual studio 创建项目失败vstemplate
mysql database source command to import sql file records
Domain objects share data
Fiddler packet capture principle explanation and example operation
Visual Studio 自定义项目模板
The sword refers to Offer | Adjust the order of the array so that the odd numbers come before the even numbers









