C语言函数ANSI风格与K&R风格【是int fun(void)还是int fun()】_r&k风格-程序员宅基地

技术标签: C  Linux  

在学习C语言函数指针的过程中,我发现了函数的参数列的一些问题:无论参数部分是否填入类型,编译均可通过。

 

查阅资料后发现C语言中有两种函数参数风格:ANSI和K&R。ANSI是我们所学习的风格;K&R则是老式的,是编写Linux内核所使用的风格。

 

int foo(void) 还有 int foo(int a, int b)就是ANSI风格的。它的特点是参数都有类型

对应的,int foo() 和 int foo(a,b)是K&R风格,它使用初始化列:

//无参数的K&R风格接受任何参数,后者的声明方法是接受两个任意类型的参数
int foo();                 //int foo(a,b);
//参数类型声明在函数体前面
int foo(a, b)
int a;
int b;
{
    return a+b;
}

当我们写下int foo()的时候,我们实际上已经在不知不觉中使用了K&R风格的函数声明了!当然后面的函数体部分奇怪的结构仅限C编译器,这些代码以cpp后缀编译时无法通过。

函数调用时,编译器检查的是函数声明。因此假如函数声明是形如int foo()的,无论我们函数体中实际传入多少参数,编译都不会报错。这使得很多情况下我们无法检查出问题。因此并不推荐这样的写法。

 

因此在绝大多数C开发中,我们应该使用ANSI风格,在没有参数的函数都要在参数部分注明void,以便编译器进行参数检查,从而尽可能地减少人为的错误。

 

拓展:K&R风格不仅包括函数参数,还有其他一系列约定。列举一些有趣的内容:

1. 使用8个字符缩进:有人可能抱怨缩进导致一行无法容纳许多字符。但是他们的看法是,超过3级缩进说明代码需要重构

2. 命名尽量通俗:以变量类型命名的微软经常开发出糟糕的代码

3. 大括号的位置:非函数语句起始大括号在行尾,结束大括号在行首;函数语句的大括号都在行首

当然这些内容仁者见仁智者见智了。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/killfat/article/details/88046001

智能推荐

EMMC驱动中常用命令说明及初始化顺序_mmc_send_cid-程序员宅基地

文章浏览阅读1.4k次。EMMC驱动中常用命令说明及初始化顺序一、命令说明mmc_go_idle发送CMD0指令,GO_IDLE_STATE使mmc card进入idle state。虽然进入到了Idle State,但是上电复位过程并不一定完成了,这主要靠读取OCR的busy位来判断,而流程归结为下一步。mmc_send_op_cond发送CMD1指令,SEND_OP_COND这里会设置card的工作电..._mmc_send_cid

3ds Max随堂笔记 二维、三维、世界空间修改器_由二维图纸转换为三维模型的插件-程序员宅基地

文章浏览阅读2.6k次,点赞2次,收藏6次。 2022.3.28 早十文章目录4.1 修改器建模综述4.2 修改器命令面板4.3 二维图形编辑修改器4.4 三维图形编辑修改器4.4.1弯曲修改器4.4.2锥化修改器4.4.3扭曲修改器4.4.4FFD修改器(自由变形)5.1 世界空间修改器概述5.2 路径变形修改器5.2 毛发修改器4.1 修改器建模综述#mermaid-svg-12QA56qYK5ChV8B7 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16p_由二维图纸转换为三维模型的插件

带你们了解数据安全探索者之路-程序员宅基地

文章浏览阅读202次。数据是新时代的生产要素;保护数据原生价值,实现数据的所有权保护、交换与管理;完善数据在收集、使用、存储等阶段的全生命周期安全;研究分析复杂物理数据交互场景中的数据安全攻防机理;在保护数据所有权的前提下实现高价值数据的安全交易;安全技术标准的推广与法律法规的完善。一、数据安全防护是重大战略需求当前的行业共识认为数据是驱动数字经济发展的核心动力。以数据为基础的云计算、物联网、区块链、人工智能等经济生态及相关产业链在智慧城市升级、国家重大基建产业发展等方面发挥着积极的作用。《中国数字经济发展白皮书》显示,2.

深度强化学习(DRL)算法系列文章合集-程序员宅基地

文章浏览阅读1.1k次,点赞34次,收藏9次。这个系列介绍了常用的单智能体强化学习方法,也有些没有写到,比如 SAC,希望以后有时间可以回来补完。下个系列会开始介绍 RLXF(包括 RLHF、RLAIF)欢迎关注。奋斗,追求,不达目的,誓不罢休!

html5黑色大气的个人博客全屏滚动个人主页源码HTML+JS+CSS-程序员宅基地

文章浏览阅读666次,点赞7次,收藏6次。html5黑色大气的个人博客全屏滚动个人主页源码HTML+JS+CSS

前端技术学习第六讲:JavaScript 解析JSON_javascript json 识别有某个字段的为根-程序员宅基地

文章浏览阅读734次。JavaScript 解析JSON一、JSONJSON的全称是”JavaScript Object Notation”,意思是JavaScript对象表示法,它是一种基于文本,独立于语言的轻量级数据交换格式。XML也是一种数据交换格式,为什么没有选择XML呢?因为XML虽然可以作为跨平台的数据交换格式,但是在JS(JavaScript的简写)中处理XML非常不方便,同时XML标记比数据多,增加了交换产生的流量,而JSON没有附加的任何标记,在JS中可作为对象处理,所以我们更倾向于选择JSON来交换数据。_javascript json 识别有某个字段的为根

随便推点

托福写作4-the entertainer or athlete you most want meet_famous enterainer and athlete-程序员宅基地

文章浏览阅读432次。if you could meet a famous entertainer or athlete, who would that be , and why?_famous enterainer and athlete

骨龄测试软件app_【测试工具】这些APP实用测试工具,不知道你就out了!-程序员宅基地

文章浏览阅读2.4k次。本期,我将给大家介绍14款实用的测试工具,希望能够帮到大家!(建议收藏)UI自动化测试工具1.uiautomator2Github地址:https://github.com/openatx/uiautomator2star:1.9k介绍:openatx开源的ui自动化工具,支持android和ios。主要面向的编程语言是python,api设计简洁易用,在开源社区也是很受欢迎。原理图:与appi..._测骨龄软件

STM8学习笔记---串口uart1_stm8串口发送字符串-程序员宅基地

文章浏览阅读1.4w次,点赞3次,收藏14次。使用uart1串口,需要用到stm8s_uart1.c和stm8s_uart1.h两个文件1、建立工程目录结构如下:2、编写uart.h文件如下:#ifndef __UART_H#define __UART_H#include "stm8s.h"#include "stm8s_clk.h"void USART_Configuration(void); //串口配置函数void UART_sen..._stm8串口发送字符串

Sass语法学习-程序员宅基地

文章浏览阅读275次,点赞4次,收藏9次。自动监控把sass编译成css文件,命令行在监控的sass后面,可以为 sass 生成 css 样式指定生成的格式,默认是nested型;通过 --style nested( 嵌套 - 默认 )|compact( 紧促型 )|compressed( 压缩 )|expended( 扩展 ) 命令,可以为 sass 生成 css 样式指定生成的格式2、合成文件@improt在sass中,使用@improt可以把多个不同的sass文件合成一个css文件,在合成的sass中有两种方式,

Struts2的优点_struts2框架优点-程序员宅基地

文章浏览阅读5.5k次。首先,我们得知道struts2是什么,那我们才知道这个struts2有什么优缺点,是吧。所以,我先来解释一下struts2到底是什么。Apache Struts是一个免费,开源,MVC框架, 现代Java web应用框架。 它有利于约定优于配置, 可扩展的使用一个插件架构,并附带插件的支持 休息,AJAX和JSON。 所以呢,针对于struts2是什么,我们就可以知道struts2有什么优点了。_struts2框架优点

Java 文件读写操作-程序员宅基地

文章浏览阅读42次。1【1】按字节读写,一次只读取一个字节,效率比较低 1 package bk1; 2 3 import java.io.File; 4 import java.io.FileInputStream; 5 6 import java.io.IOException; 7 import java.io.InputStream; 8 9 10 public...