C语言格式书写规范

C语言格式书写规范
C语言格式书写规范

C语言书写规范指南

第1章文件结构

每个C程序通常分为两个文件。一个文件用于保存程序的声明(declaration),称为头文件。另一个文件用于保存程序的实现(implementation),称为定义(definition)文件。

C程序的头文件以“.h”为后缀,C程序的定义文件以“.c”为后缀。

版权和版本的声明

版权和版本的声明位于头文件和定义文件的开头(参见示例1-1),主要内容有:

(1)版权信息。

(2)文件名称,标识符,摘要。

(3)当前版本号,作者/修改者,完成日期。

(4)版本历史信息。

/*

*Copyright(c)2001,吉林大学物理学院无线电

*Allrightsreserved.

*

*文件名称:

*文件标识:

*摘要:简要描述本文件的内容

*

*当前版本:

*作者:输入作者(或修改者)名字

*完成日期:2007年7月20日

*

*取代版本:

*原作者:输入原作者(或修改者)名字

*完成日期:2007年5月10日

*/

示例1-1版权和版本的声明

头文件的结构

头文件由三部分内容组成:

(1)头文件开头处的版权和版本声明(参见示例1-1)。

(2)预处理块。

(3)函数和类结构声明等。

假设头文件名称为,头文件的结构参见示例1-2。

【规则1-2-1】为了防止头文件被重复引用,应当用#ifndef/#define/#endif结构产生预处理块。

【规则1-2-2】用#include <>格式来引用标准库的头文件(编译器将从标准库目录开始搜索)。

【规则1-2-3】用#include “”格式来引用非标准库的头文件(编译器将从用户的工作目录开始搜索)。

【规则1-2-4】#include 后面使用TAB键控制排版。

【规则1-2-5】头文件中只存放“声明”而不存放“定义”

【规则1-2-6】全局变量在头文件中声明,在.c文件中定义

.h extern in tvalue; 声明。

.c in tvalue=0x10; 定义。

【规则1-2-7】局部变量在.c中定义(static)unsigned in tvalue; 定义。

【建议2-3-1】对于表达式比较长的for语句和if语句,为了紧凑起见可以适当地去掉一些空格,如for(i=0;i<10;i++)和if((a<=b)&&(c<=d))

void Func1(int x,int y,int z);

【规则4-1-1】如果代码行中的运算符比较多,用括号确定表达式的操作顺序,避免使用默认的优先级。

由于将表4-1熟记是比较困难的,为了防止产生歧义并提高可读性,应当用括号确定表达式的操作顺序。例如:

word = (high<<8)|low

if ((a|b)&&(a&c))

复合表达式

如a=b=c=0这样的表达式称为复合表达式。允许复合表达式存在的理由是:

(1)书写简洁;(2)可以提高编译效率。但要防止滥用复合表达式。

【规则4-2-1】不要编写太复杂的复合表达式。例如:

i=a>=b&&c

【规则4-2-2】不要有多用途的复合表达式。例如:

d=(a=b+c)+r;

该表达式既求a值又求d值。应该拆分为两个独立的语句:

a =

b + c;

d = a + r;

【规则4-2-3】不要把程序中的复合表达式与“真正的数学表达式”混淆。例如:if(a

if ((a

而是成了令人费解的

if((a

语句

if语句是C语言中最简单、最常用的语句,然而很多程序员用隐含错误的方式

写if语句。本节以“与零值比较”为例,展开讨论。

布尔变量与零值比较

【规则4-3-1】不可将布尔变量直接与TRUE、FALSE或者1、0进行比较。

根据布尔类型的语义,零值为“假”(记为FALSE),任何非零值都是“真”(记为TRUE)。TRUE的值究竟是什么并没有统一的标准。例如VisualC++将TRUE定义为1,

而VisualBasic则将TRUE定义为-1。

假设布尔变量名字为flag,它与零值比较的标准if语句如下:

if (flag)//表示flag为真

if (!flag)//表示flag为假

其它的用法都属于不良风格,例如:

if(flag==TRUE)

if(flag==1)

if(flag==FALSE)

if(flag==0)

整型变量与零值比较

【规则4-3-2】应当将整型变量用“==”或“!=”直接与0比较。假设整

型变量的名字为value,它与零值比较的标准if语句如下:

if(value==0)

if(value!=0)

不可模仿布尔变量的风格而写成

if(value) //会让人误解value是布尔变量

if(!value)

浮点变量与零值比较

【规则4-3-3】不可将浮点变量用“==”或“!=”与任何数字比较。

千万要留意,无论是float还是double类型的变量,都有精度限制。所以一定要避免将浮点变量用“==”或“!=”与数字比较,应该设法转化成“>=”或“<=”形式。

假设浮点变量的名字为x,应当将

if(x==//隐含错误的比较转化为

if((x>=-EPSINON)&&(x<=EPSINON))

其中EPSINON是允许的误差(即精度)。

指针变量与零值比较

【规则4-3-4】应当将指针变量用“==”或“!=”与NULL比较。

指针变量的零值是“空”(记为NULL)。尽管NULL的值与0相同,但是两者意义不同。假设指针变量的名字为p,它与零值比较的标准if语句如下:

if(p==NULL) //p与NULL显式比较,强调p是指针变量

if(p!=NULL)

不要写成

if(p==0) //容易让人误解p是整型变量

if(p!=0)

或者

if(p) //容易让人误解p是布尔变量

if(!p)

对if语句的补充说明

有时候我们可能会看到if(NULL==p)这样古怪的格式。不是程序写错了,是程序

员为了防止将if(p==NULL)误写成if(p=NULL),而有意把p和NULL颠倒。编译器认为if(p=NULL)是合法的,但是会指出if(NULL=p)是错误的,因为NULL不能被赋值。

程序中有时会遇到if/else/return的组合,应该将如下不良风格的程序

if(condition)

returnx;

returny;

改写为

if(condition)

{

returnx;

}

else

{

returny;

}

或者改写成更加简练的

return(conditionx:y);

循环语句的效率

C循环语句中,for语句使用频率最高,while语句其次,do语句很少用。本节重点论述循环体的效率。提高循环体效率的基本办法是降低循环体的复杂性。

【建议4-4-1】在多重循环中,如果有可能,应当将最长的循环放在最内层,最短的循环

放在最外层,以减少CPU跨切循环层的次数。例如示例4-4(b)的效率比示例4-4(a)的高。for (row=0; row<100; row++)

{

for (col=0; col<5; col++)

{

fum = sum+a[row][col];

}

}

示例4-4(a)低效率:长循环在最外层

for (col=0; col<5; col++)

{

for (row=0; row<100; row++)

{

fum = sum+a[row][col];

}

}

示例4-4(b)高效率:长循环在最内层

【建议4-4-2】如果循环体内存在逻辑判断,并且循环次数很大,宜将逻辑判断移到循环体的外面。示例4-4(c)的程序比示例4-4(d)多执行了N-1次逻辑判断。并且由于前者老要进行逻辑判断,打断了循环“流水线”作业,使得编译器不能对循环进行优化处理,降低了效率。如果N非常大,最好采用示例4-4(d)的写法,可以提高效率。如果N非常小,两者效率差别并不明显,采用示例4-4(c)的写法比较好,因为程序更加简洁。

for (i=0; i

{

if (condition

{

DoSomething();

}

else

{

DoOtherthing();

}

}

表4-4(c)效率低但程序简洁

if(condition)

{

for(i=0;i

}

else

{

for(i=0;i

}

表4-4(d)效率高但程序不简洁

语句的循环控制变量

【规则4-5-1】不可在for循环体内修改循环变量,防止for循环失去控制。

【建议4-5-1】建议for语句的循环控制变量的取值采用“半开半闭区间”写法。

示例4-5(a)中的x值属于半开半闭区间“0=

示例4-5(b)中的x值属于闭区间“0=

相比之下,示例4-5(a)的写法更加直观,尽管两者的功能是相同的。

for(intx=0;x

{

}

示例4-5(a)循环变量属于半开半闭区间

for(intx=0;x<=N-1;x++)

{

}

示例4-5(b)循环变量属于闭区间

语句

switch是多分支选择语句,而if语句只有两个分支可供选择。虽然可以用嵌套的if语句来实现多分支选择,但那样的程序冗长难读。这是switch语句存在的理由。

switch语句的基本格式是:

switch(variable)

{

case value1:

{

break;

}

case value2:

{

break;

}

default:

{

break;

}

}

【规则4-6-1】每个case语句的结尾不要忘了加break,否则将导致多个分支重叠(除

非有意使多个分支重叠)。

【规则4-6-2】不要忘记最后那个default分支。即使程序真的不需要default处理,也应该保留语句default:break;这样做并非多此一举,而是为了防止别人误以为你忘了default处理。

语句

自从提倡结构化设计以来,goto就成了有争议的语句。首先,由于goto语句可以灵活跳转,如果不加限制,它的确会破坏结构化设计风格。其次,goto语句经常带来错误或隐患。它可能跳过了某些对象的构造、变量的初始化、重要的计算等语句,例如:

goto state;

String s1,s2; //被goto跳过

int sum = 0;//被goto跳过

state:

如果编译器不能发觉此类错误,每用一次goto语句都可能留下隐患。

很多人建议废除C的goto语句,以绝后患。但实事求是地说,错误是程序员自己造成的,不是goto的过错。goto语句至少有一处可显神通,它能从多重循环体中咻地一下子跳到外面,用不着写很多次的break语句;例如

{…

{…

{…

gotoerror;

}

}

}

error:

就象楼房着火了,来不及从楼梯一级一级往下走,可从窗口跳出火坑。所以我们主张少用、慎用goto语句,而不是禁用。

第5章常量

常量是一种标识符,它的值在运行期间恒定不变。C语言用#define来定义常量(称为宏常量)。C++语言除了#define外还可以用const来定义常量(称为const常量)。

为什么需要常量

如果不使用常量,直接在程序中填写数字或字符串,将会有什么麻烦

(1)程序的可读性(可理解性)变差。程序员自己会忘记那些数字或字符串是什么意思,用户则更加不知它们从何处来、表示什么。

(2)在程序的很多地方输入同样的数字或字符串,难保不发生书写错误。

(3)如果要修改数字或字符串,则会在很多地方改动,既麻烦又容易出错。

【规则5-1-1】尽量使用含义直观的常量来表示那些将在程序中多次出现的数字或字符

串。

例如:

#define MAX 100 /* C语言的宏常量*/

constint MAX=100; // C++语言的const常量

constfloat PI=;// C++语言的const常量

与#define的比较

C++语言可以用const来定义常量,也可以用#define来定义常量。但是前者比后者有更多的优点:

(1)const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意

料不到的错误(边际效应)。

(2)有些集成化的调试工具可以对const常量进行调试,但是不能对宏常量进行调试。

【规则5-2-1】在C++程序中只使用const常量而不使用宏常量,即const常量完全取代宏常量。

常量定义规则

【规则5-3-1】需要对外公开的常量放在头文件中,不需要对外公开的常量放在定义文件的头部。为便于管理,可以把不同模块的常量集中存放在一个公共的头文件中。

【规则5-3-2】如果某一常量与其它常量密切相关,应在定义中包含这种关系,而不

应给出一些孤立的值。

例如:

const float RADIUS=100;

const float DIAMETER=RADIUS*2;

第6章函数设计

函数是C程序的基本功能单元,其重要性不言而喻。函数设计的细微缺点很容易导致该

函数被错用,所以光使函数的功能正确是不够的。本章重点论述函数的接口设计和内部实现

的一些规则。

函数接口的两个要素是参数和返回值。C语言中,函数的参数和返回值的传递方式有两种:值传递(passbyvalue)和指针传递(passbypointer)。C++语言中多了引用传递(passbyreference)。由于引用传递的性质象指针传递,而使用方式却象值传递,初学者

常常迷惑不解,容易引起混乱,请先阅读节“引用与指针的比较”。

参数的规则

【规则6-1-1】参数的书写要完整,不要贪图省事只写参数的类型而省略参数名字。如果函数没有参数,则用void填充。

例如:

void SetValue(int width, int height);//良好的风格

void SetValue(int,int); //不良的风格

float GetValue(void); //良好的风格

float GetValue(); //不良的风格

【规则6-1-2】参数命名要恰当,顺序要合理。

例如编写字符串拷贝函数StringCopy,它有两个参数。如果把参数名字起为str1和

str2,例如

void StringCopy(char *str1,char *str2);

那么我们很难搞清楚究竟是把str1拷贝到str2中,还是刚好倒过来。

可以把参数名字起得更有意义,如叫strSource和strDestination。这样从名字上就可以看出应该把strSource拷贝到strDestination。

还有一个问题,这两个参数那一个该在前那一个该在后参数的顺序要遵循程序员的习惯。一般地,应将目的参数放在前面,源参数放在后面。

如果将函数声明为:

void StringCopy(char *strSource,char *strDestination);

别人在使用时可能会不假思索地写成如下形式:

char str[20];

StringCopy(str,“HelloWorld”);//参数顺序颠倒

【规则6-1-3】如果参数是指针,且仅作输入用,则应在类型前加const,以防止该指针在函数体内被意外修改。

例如:

void StringCopy(char *strDestination,const char *strSource);

【规则6-1-4】如果输入参数以值传递的方式传递对象,则宜改用“const&”方式来传

递,这样可以省去临时对象的构造和析构过程,从而提高效率。

【建议6-1-1】避免函数有太多的参数,参数个数尽量控制在5个以内。如果参数太多,在使用时容易将参数类型或顺序搞错。

【建议6-1-2】尽量不要使用类型和数目不确定的参数。

C标准库函数printf是采用不确定参数的典型代表,其原型为:

int printf(const chat *format[,argument]…);

这种风格的函数在编译时丧失了严格的类型安全检查。

返回值的规则

【规则6-2-1】不要省略返回值的类型。

C语言中,凡不加类型说明的函数,一律自动按整型处理。这样做不会有什么好处,却容易被误解为void类型。

C++语言有很严格的类型安全检查,不允许上述情况发生。由于C++程序可以调用C函数,为了避免混乱,规定任何C++/C函数都必须有类型。如果函数没有返回值,那么应声明

为void类型。

【规则6-2-2】函数名字与返回值类型在语义上不可冲突。违反

这条规则的典型代表是C标准库函数getchar。

例如:

charc;

c=getchar();

if(c==EOF)

按照getchar名字的意思,将变量c声明为char类型是很自然的事情。但不幸的是

getchar的确不是char类型,而是int类型,其原型如下:

int getchar(void);

由于c是char类型,取值范围是[-128,127],如果宏EOF的值在char的取值范围之外,

那么if语句将总是失败,这种“危险”人们一般哪里料得到!导致本例错误的责任并不在用户,是函数getchar误导了使用者。

【规则6-2-3】不要将正常值和错误标志混在一起返回。正常值用输出参数获得,而错误标志用return语句返回。

回顾上例,C标准库函数的设计者为什么要将getchar声明为令人迷糊的int类型呢

他会那么傻吗

在正常情况下,getchar的确返回单个字符。但如果getchar碰到文件结束标志或发生读错误,它必须返回一个标志EOF。为了区别于正常的字符,只好将EOF定义为负数

(通常为负1)。因此函数getchar就成了int类型。

我们在实际工作中,经常会碰到上述令人为难的问题。为了避免出现误解,我们应该将

正常值和错误标志分开。即:正常值用输出参数获得,而错误标志用return语句返回。

函数getchar可以改写成BOOL GetChar(char *c);

虽然gechar比GetChar灵活,例如putchar(getchar());但是如果getchar用错了,它的灵活性又有什么用呢

【建议6-2-1】有时候函数原本不需要返回值,但为了增加灵活性如支持链式表达,可以附加返回值。

例如字符串拷贝函数strcpy的原型:

char *strcpy(char *strDest,const char *strSrc);

strcpy函数将strSrc拷贝至输出参数strDest中,同时函数的返回值又是strDest。这样做并非多此一举,可以获得如下灵活性:

charstr[20];

int length=strlen(strcpy(str,“HelloWorld”));

【建议6-2-2】如果函数的返回值是一个对象,有些场合用“引用传递”替换“值传递”可以提高效率。而有些场合只能用“值传递”而不能用“引用传递”,否则会出错。

例如:

class String

{…

//赋值函数

String &operate=(const String &other);

//相加函数,如果没有friend修饰则只许有一个右侧参数

friend String operate+(const String &s1,const String &s2);

private:

char*m_data;

}

String的赋值函数operate=的实现如下:

String &String::operate=(const String &other)

{

if(this==&other)

return*this;

deletem_data;

m_data=newchar[strlen+1];

strcpy(m_data,;

return*this;//返回的是*this的引用,无需拷贝过程

}

对于赋值函数,应当用“引用传递”的方式返回String对象。如果用“值传递”的

方式,虽然功能仍然正确,但由于return语句要把*this拷贝到保存返回值的外部存储单元之中,增加了不必要的开销,降低了赋值函数的效率。例如:

Stringa,b,c;

a=b;//如果用“值传递”,将产生一次*thi

s 拷贝

a=b=c;//如果用“值传递”,将产生两次*thi拷贝String的相加函数operate+的实现如下:

String operate+(const String &s1,const String &s2)

{

String temp;

;//是仅含‘\0’的字符串

=newchar[strlen+strlen+1];

strcpy,;

strcat,;

return temp;

}

对于相加函数,应当用“值传递”的方式返回String对象。如果改用“引用传递”,

那么函数返回值是一个指向局部对象temp的“引用”。由于temp在函数结束时被自动销毁,将导致返回的“引用”无效。例如:

c=a+b;

此时a+b并不返回期望值,c什么也得不到,流下了隐患。

函数内部实现的规则

不同功能的函数其内部实现各不相同,看起来似乎无法就“内部实现”达成一致的观点。但根据经验,我们可以在函数体的“入口处”和“出口处”从严把关,从而提高函数的质量。

【规则6-3-1】在函数体的“入口处”,对参数的有效性进行检查。

很多程序错误是由非法参数引起的,我们应该充分理解并正确使用“断言”(assert)来防止此类错误。详见节“使用断言”。

【规则6-3-2】在函数体的“出口处”,对return语句的正确性和效率进行检查。

如果函数有返回值,那么函数的“出口处”是return语句。我们不要轻视return语句。如果return语句写得不好,函数要么出错,要么效率低下。

注意事项如下:

(1)return语句不可返回指向“栈内存”的“指针”或者“引用”,因为该内存在函数体结束时被自动销毁。例如

char *Func(void)

{

char str[]=“helloworld”;//str的内存位于栈上

return str; //将导致错误

}

(2)要搞清楚返回的究竟是“值”、“指针”还是“引用”。

(3)如果函数返回值是一个对象,要考虑return语句的效率。例如

return String(s1+s2);

这是临时对象的语法,表示“创建一个临时对象并返回它”。不要以为它与“先创建一个局部对象temp并返回它的结果”是等价的,如

String temp(s1+s2);

return temp;

实质不然,上述代码将发生三件事。首先,temp对象被创建,同时完成初始化;然后拷贝构造函数把temp拷贝到保存返回值的外部存储单元中;最后,temp在函数结束时被销毁(调用析构函数)。然而“创建一个临时对象并返回它”的过程是不同的,编译器直接把临

时对象创建并初始化在外部存储单元中,省去了拷贝和析构的化费,提高了效率。

类似地,我们不要将

return int(x+y);//创建一个临时变量并返回它

写成

int temp=x+y;

return temp;

由于内部数据类型如int,float,double的变量不存在构造函数与析构函数,虽然该“临时变量的语法”不会提高多少效率,但是程序更加简洁易读。

其它建议

【建议6-4-1】函数的功能要单一,不要设计多用途的函数。

【建议6-4-2】函数体的规模要小,尽量控制在50行代码之内。

【建议6-4-3】尽量避免函数带有“记忆”功能。相同的输入应当产生相同的输出。带有“记忆”功能的函数,其行为可能是不可预测的,因为它的行为可能取决于某种“记忆状态”。这样的函数既不易理解又不利于测试和维护。在C/C++语言中,函数的static局部变量是函数的“记忆”存储器。建议尽量少用static局部变量,除非必需。

【建议6-4-4】不仅要检查输入参数的有效性,还要检查通过其它途径进入函数体内的变量的有效性,例如全局变量、文件句柄等。

【建议6-4-5】用于出错处理的返回值一定要清楚,让使用者不容易忽视或误解错误情

况。

使用断言

程序一般分为Debug版本和Release版本,Debug版本用于内部调试,Release版本发行给用户使用。

断言assert是仅在Debug版本起作用的宏,它用于检查“不应该”发生的情况。示

例6-5是一个内存复制函数。在运行过程中,如果assert的参数为假,那么程序就会中止(一般地还会出现提示对话,说明在什么地方引发了assert)。

void *memcpy(void *pvTo,const void *pvFrom,size_t size)

{

assert((pvTo!=NULL)&&(pvFrom!=NULL));//使用断言

byte*pbTo=(byte*)pvTo; //防止改变pvTo的地址

byte*pbFrom=(byte*)pvFrom; //防止改变pvFrom的地址

while(size-->0)

*pbTo++=*pbFrom++;

returnpvTo;

}

示例6-5复制不重叠的内存块

assert不是一个仓促拼凑起来的宏。为了不在程序的Debug版本和Release版本引起差

别,assert不应该产生任何副作用。所以assert不是函数,而是宏。程序员可以把assert看

成一个在任何系统状态下都可以安全使用的无害测试手段。如果程序在assert处终止了,并

不是说含有该assert的函数有错误,而是调用者出了差错,assert可以帮助我们找到发生错

误的原因。

很少有比跟踪到程序的断言,却不知道该断言的作用更让人沮丧的事了。你化了很多时间,不是为了排除错误,而只是为了弄清楚这个错误到底是什么。有的时候,程序员偶尔还会设计出有错误的断言。所以如果搞不清楚断言检查的是什么,就很难判断错误是出现在程序中,还是出现在断言中。幸运的是这个问题很好解决,只要加上清晰的注释即可。这本是显而易见的事情,可是很少有程序员这样做。这好比一个人在森林里,看到树上钉着一块“危险”的大牌子。但危险到底是什么树要倒有废井有野兽除非告诉人们“危险”是什么,否则这个警告牌难以起到积极有效的作用。难以理解的断言常常被程序员忽略,甚至被删除。

【规则6-5-1】使用断言捕捉不应该发生的非法情况。不要混淆非法情况与错误情况

之间的区别,后者是必然存在的并且是一定要作出处理的。

【规则6-5-2】在函数的入口处,使用断言检查参数的有效性(合法性)。

【建议6-5-1】在编写函数时,要进行反复的考查,并且自问:“我打算做哪些假定”一旦确定了的假定,就要使用断言对假定进行检查。

【建议6-5-2】一般教科书都鼓励程序员们进行防错设计,但要记住这种编程风格可能会隐瞒错误。当进行防错设计时,如果“不可能发生”的事情的确发生了,则要使用断言进行报警。

引用与指针的比较

引用是C++中的概念,初学者容易把引用和指针混淆一起。一下程序中,n是m的一个引用(reference),m是被引用物(referent)。

int m;

int &n=m;

n相当于m的别名(绰号),对n的任何操作就是对m的操作。例如有人名叫王小毛,他的

绰号是“三毛”。说“三毛”怎么怎么的,其实就是对王小毛说三道四。所以n既不是m的拷贝,也不是指向m的指针,其实n就是m它自己。

引用的一些规则如下:

(1)引用被创建的同时必须被初始化(指针则可以在任何时候被初始化)。

(2)不能有NULL引用,引用必须与合法的存储单元关联(指针则可以是NULL)。

(3)一旦引用被初始化,就不能改变引用的关系(指针则可以随时改变所指的对象)。以下示例程序中,k被初始化为i的引用。语句k=j并不能将k修改成为j的引用,

只是把k的值改变成为6。由于k是i的引用,所以i的值也变成了6。

int i=5;

int j=6;

int &k=i;

k=j; //k和i的值都变成了6;

上面的程序看起来象在玩文字游戏,没有体现出引用的价值。引用的主要功能是传递函数的参数和返回值。C++语言中,函数的参数和返回值的传递方式有三种:值传递、指针传递和引用传递。

以下是“值传递”的示例程序。由于Func1函数体内的x是外部变量n的一份拷贝,改变x的值不会影响n,所以n的值仍然是0。

void Func1(int x)

{

x=x+10;

}

intn=0;

Func1(n);

cout<<“n=”<

以下是“指针传递”的示例程序。由于Func2函数体内的x是指向外部变量n的指针,改变该指针的内容将导致n的值改变,所以n的值成为10。

void Func2(int *x)

{

(*x)=(*x)+10;

}

int n=0;

Func2(&n);

cout<<“n=”<

以下是“引用传递”的示例程序。由于Func3函数体内的x是外部变量n的引用,x

和n是同一个东西,改变x等于改变n,所以n的值成为10。

void Func3(int &x)

{

x=x+10;

}

int n=0;

Func3(n);

cout<<“n=”<

对比上述三个示例程序,会发现“引用传递”的性质象“指针传递”,而书写方式象“值传递”。实际上“引用”可以做的任何事情“指针”也都能够做,为什么还要“引用”这东西

答案是“用适当的工具做恰如其分的工作”。

指针能够毫无约束地操作内存中的如何东西,尽管指针功能强大,但是非常危险。就象一把刀,它可以用来砍树、裁纸、修指甲、理发等等,谁敢这样用

如果的确只需要借用一下某个对象的“别名”,那么就用“引用”,而不要用“指针”,以免发生意外。比如说,某人需要一份证明,本来在文件上盖上公章的印子就行了,如果把取公章的钥匙交给他,那么他就获得了不该有的权利。

C语言考试重点(考前必看,吃透必过)

C语言最重要的知识点 总体上必须清楚的: 1)程序结构是三种: 顺序结构、选择结构(分支结构)、循环结构。 2)读程序都要从main()入口, 然后从最上面顺序往下读(碰到循环做循环,碰到选择做选择),有且只有一个main函数。 3)计算机的数据在电脑中保存是以二进制的形式. 数据存放的位置就是他的地址. 4)bit是位是指为0 或者1。 byte是指字节, 一个字节 = 八个位. 概念常考到的: 1、编译预处理不是C语言的一部分,不占运行时间,不要加分号。C语言编译的程序称为源程序,它以ASCII数值存放在文本文件中。 2、define PI 3.1415926; 这个写法是错误的,一定不能出现分号。 3、每个C语言程序中main函数是有且只有一个。 4、在函数中不可以再定义函数。 5、算法:可以没有输入,但是一定要有输出。 6、break可用于循环结构和switch语句。 7、逗号运算符的级别最低,赋值的级别倒数第二。 第一章C语言的基础知识 第一节、对C语言的基础认识 1、C语言编写的程序称为源程序,又称为编译单位。 2、C语言书写格式是自由的,每行可以写多个语句,可以写多行。 3、一个C语言程序有且只有一个main函数,是程序运行的起点。 第二节、熟悉vc++ 1、VC是软件,用来运行写的C语言程序。 2、每个C语言程序写完后,都是先编译,后链接,最后运行。(.c---→.obj---→.exe)这个过程中注意.c和.obj文件时无法运行的,只有.exe 文件才可以运行。(常考!) 第三节、标识符 1、标识符(必考内容): 合法的要求是由字母,数字,下划线组成。有其它元素就错了。 并且第一个必须为字母或则是下划线。第一个为数字就错了 2、标识符分为关键字、预定义标识符、用户标识符。 关键字:不可以作为用户标识符号。main define scanf printf 都不是关键字。迷惑你的地方If是可以做为用户标识符。因为If中的第一个字母大写了,所以不是关键字。 预定义标识符:背诵define scanf printf include。记住预定义标识符可以做为用户标识符。

C语言格式书写规范

C语言书写规范指南 第1章文件结构 每个C程序通常分为两个文件。一个文件用于保存程序的声明(declaration),称为头文件。另一个文件用于保存程序的实现(implementation),称为定义(definition)文件。 C程序的头文件以“、h”为后缀,C程序的定义文件以“、c”为后缀。 1、1版权与版本的声明 版权与版本的声明位于头文件与定义文件的开头(参见示例1-1),主要内容有: (1)版权信息。 (2)文件名称,标识符,摘要。 (3)当前版本号,作者/修改者,完成日期。 (4)版本历史信息。 /* *Copyright(c)2001,吉林大学物理学院无线电 *Allrightsreserved、 * *文件名称: *文件标识: *摘要:简要描述本文件的内容 * *当前版本:1、1 *作者:输入作者(或修改者)名字 *完成日期:2007年7月20日 * *取代版本:1、0 *原作者:输入原作者(或修改者)名字 *完成日期:2007年5月10日 */ 示例1-1版权与版本的声明

1、2头文件的结构 头文件由三部分内容组成: (1)头文件开头处的版权与版本声明(参见示例1-1)。 (2)预处理块。 (3)函数与类结构声明等。 假设头文件名称为SCL_SPI、h,头文件的结构参见示例1-2。 【规则1-2-1】为了防止头文件被重复引用,应当用#ifndef/#define/#endif结构产生预处理块。 【规则1-2-2】用#include <>格式来引用标准库的头文件(编译器将从标准库目录开始搜索)。 【规则1-2-3】用#include “”格式来引用非标准库的头文件(编译器将从用户的工作目录开始搜索)。 【规则1-2-4】#include 后面使用TAB键控制排版。 【规则1-2-5】头文件中只存放“声明”而不存放“定义” 【规则1-2-6】全局变量在头文件中声明,在、c文件中定义 、h extern in tvalue; 声明。 、c in tvalue=0x10; 定义。 【规则1-2-7】局部变量在、c中定义(static)unsigned in tvalue; 定义。 //版权与版本声明见示例1-1,此处省略。 #ifndef SCL_SPI_H //防止SCL_SPI、h被重复引用 #define SCL_SPI_H #include //引用标准库的头文件 … #include “SCL_CAN、h” //引用非标准库的头文件 … void Function1(…);//全局函数声明 … extern unsign int value;//全局变量声明 #endif 示例1-2C头文件的结构 1、3定义文件的结构 定义文件有三部分内容: (1)定义文件开头处的版权与版本声明(参见示例1-1)。 (2)对一些头文件的引用。 (3)程序的实现体(包括数据与代码)。

C语言编写规范之注释

1、头文件包含Includes 2、私有类型定义 Private typedef 3、私有定义Private define 4、私有宏定义 Private macro 5、私有变量 Private variables 6、私有函数原型Private function prototypes 7、私有函数Private functions 8、私有函数前注释 /****************************************************************************** * * Function Name : FSMC_NOR_Init * Description : Configures the FSMC and GPIOs to interface with the NOR memory. * This function must be called before any write/read operation * on the NOR. * Input : None * Output : None * Return : None ******************************************************************************* / 9、程序块采用缩进风格编写,缩进空格为4。 10、相对独立的程序块之间、变量说明之后必须加空行; 11、较长的字符(>80字符)要分成多行书写,长表达式要在低优先级操作符划分新行,操作符放在新行之首,新行要恰当缩进,保持排版整齐; 12、循环、判断等语句中若有较长的表达式或语句,则要进行适应的划分,长表达式要在低优先级操作符处划分新行,操作符放在新行之首; 13、若函数或过程中的参数较长,则要进行适当的划分。 14、不允许把多个短语句写在一行中,即一行只写一条语句。 15、if、for、do、while、case、switch、default等语句自占一行,且if、for、 do、while等语句的执行语句部分无论多少都要加括号{}。 16、对齐只使用空格键,不使用TAB键; 17、 函数或过程的开始、结构的定义及循环、判断等语句中的代码都要采用缩进风格,case 语句下的情况处理语句也要遵从语句缩进要求 18、 程序块的分界符(如C/C++语言的大括号‘{’和‘}’)应各独占一行并且位于同一 列,同时与引用它们的语句左对齐。在函数体的开始、类的定义、结构的定义、枚举的定义以 及if、for、do、while、switch、case语句中的程序都要采用如上的缩进方式。 19、 在两个以上的关键字、变量、常量进行对等操作时,它们之间的操作符之前、之后或

书写C语言程序的注意事项

书写C语言程序的注意事项 1、每一C程序必须有一个main( ),且也只能有一个main( ),程序始终是从main的第一个’{‘开 始执行的;如果遇到调用函数,流程就转向对应的被调用函数,执行被调用函数中的相应语句,直到遇到return语句或‘}’时,流程又返回到主调函数中的调用处,继续执行其后的后续语句,直到遇到主函数main( )后的最后一个‘}’为止,此时结束整个程序; 2、分号是C语句的结束符,而不是分隔符,除以下情形不用分号外,其余情形都必须用分号: 1)绝对不能用分号 a)命令行后不用,即程序最开头的#include “”和#define …… b)main( )后不用; c)子函数的函数首项后不用; d)‘{’后不用; e)‘}’后不用;但是在结构体、共用体、枚举类型后的‘}’后必须用;

f)switch( )后不用; g)case常量后不用; h)default后不用; 2)可用可不用分号的情形,用了虽然没有语法错误,但是一般达不到程序设计的目的。 i)if( )后 j)else后 k)while( )后 l)for( )后 3、C语言允许有注释语句,一旦被注释起来的语句,程序是不会执行的,其注释格式为: a)/*注释内容*/:可以放于一行进行注释,也可以C语句的行末进行注释,还可以将几行一起进行注释; b)//注释内容:只能注释一行 4、C语句中的格式符是以%开头,其后紧跟一个格式说明符,如: int:%d

char:%c float:%f long:%ld unsigned:%u; double:%f,%e,%lf,%le; 八进制数:%o 十六进制数:%x; 如果要在屏幕上输出一个%,则必须用两个%来输出; 5、C程序中用到的所有变量,都必须“先定义,后使用”,且“先有值,后运算”; 6、scanf( )和printf( )中的双引号中的格式符必须从左到右与其后的输入项、输出项类型匹配、个 数相等。 7、scanf( )中的输入项前应该跟地址符&,而格式符%s对应的输入项除外; 如:int a,b;

C语言书写规范

1.C语言书写规范 1.1符号命名规则 1.1.1符号名包括模块名、常量名、标号名、子程序名等。这些名字应该能反映它所代表的实际东西,具有一定的意义,使其能够见名知义,有助于对程序功能的理解。命名采用匈牙利命名法。规则如下: (1)所有宏定义、枚举常数和const变量,用大写字母命名。在复合词里用下划线隔开每个词。 (2)复合词中每个单词的第一个字母大写。除了规则5.1.1.1以外,避免使用下划线。 (3)类、类型定义和枚举型名的第一个字母大写。 (4)函数名是复合词的,第一个词采用全部小写,随后每个单词采用第一个字母大写,其它字母小写方式;如果是单个词的,采用全部小写方式。 (5)循环变量可采用i, j, k等,不受上述规则限制。 (6) 类的成员变量应采用m_开头。 (7) 全局变量词头为g_ 。 (8) 临时变量词头为tmp_ 。 (9) 对结构体内的变量命名, 遵循变量的具体含义命名原则 (10)用小写字母的前缀表示变量的类型,前缀的下一个字母用大写。 表1 词头类型词头类型 ch char l long i integer u unsigned b boolean p pointer f float lp lon g pointer d doubl e s string st structure sz ASCII string by byte n short int H handle x,y 分别为x,y坐标

dw DWORD fn function 表2 词头变量名词头变量名 task task sig signal sb binary semaphores wd watchdog sm mutual exclusion semaphores tm timer sc counting semaphores msg message pipe pipe 例: #define ARRAY_SIZE 24 /*规则5.1.1.1*/ int g_iFlag; class MyClass /*规则5.1.1.3*/ { }; void someFunc( ) /*规则5.1.1.2和5.1.1.4*/ { .2. Q/ECC/BJ 010—2001 int nArray[ARRAY_SIZE]; unsigned char uchByte; char szName[ ]; char *pszName = szName; }

C基本书写规范

C#书写规范 一、命名 对于理解应用程序的逻辑流,命名方案是最有影响力的一种帮助。名称应该说明“什么”而不是“如何”。通过避免使用公开基础实现(它们会发生改变)的名称,可以保留简化复杂性的抽象层。例如,可以使用GetNextStudent(),而不是GetNextArrayElement()。 命名原则是: 选择正确名称时的困难可能表明需要进一步分析或定义项的目的。使名称足够长以便有一定的意义,并且足够短以避免冗长。唯一名称在编程上仅用于将各项区分开。表现力强的名称是为了帮助人们阅读;因此,提供人们可以理解的名称是有意义的。不过,请确保选择的名称符合适用语言的规则和标准。 以下几点是推荐的命名方法。 1、方法、属性、变量规范 ?避免容易被主观解释的难懂的名称,如方面名AnalyzeThis(),或者属性名xxK8。这样的名称会导致多义性。 ?在面向对象的语言中,在类属性的名称中包含类名是多余的,如Book.BookTitle。而是应该使用Book.Title。 ?使用动词-名词的方法来命名对给定对象执行特定操作的例程,如CalculateInvoiceTotal()。 ?在允许函数重载的语言中,所有重载都应该执行相似的函数。 ?只要合适,在变量名的末尾或开头加计算限定符(Avg、Sum、Min、Max、Index)。 ?在变量名中使用互补对,如min/max、begin/end 和open/close。 ?鉴于大多数名称都是通过连接若干单词构造的,请使用大小写混合的格式以简化它们的阅读。另外,为了帮助区分变量和例程,请对例程名称使用Pascal 大小写处理(CalculateInvoiceTotal),其中每个单词的第一个字母都是大写的。对于变量名,请使用camel 大小写处理(documentFormatType),其中除了第一个单词外每个单词的第一个字母都是大写的。 ?布尔变量名应该包含Is,这意味着Yes/No 或True/False 值,如fileIsFound。 ?在命名状态变量时,避免使用诸如Flag的术语。状态变量不同于布尔变量的地方是它可以具有两个以上的可能值。不是使用documentFlag,而是使用更具描述性的名称,如documentFormatType。(此项只供参考) ?即使对于可能仅出现在几个代码行中的生存期很短的变量,仍然使用有意义的名称。仅对于短循环索引使用单字母变量名,如i或j。 ?可能的情况下,尽量不要使用原义数字或原义字符串,如For i = 1 To 7。而是使用命名常数,如For i = 1 To NUM_DAYS_IN_WEEK以便于维护和理解。 二、代码书写规范 格式化使代码的逻辑结构很明显。花时间确保源代码以一致的逻辑方式进行格式化,这对于您和你的开发小组,以及以后维护源代码的其他开发人员都有很大的帮助。 以下几点是推荐的格式化方法。

C语言的规范(非常经典)

C语言的规范 C语言的规范2007-11-03 08:20A.1 排版 1-1:程序块要采用缩进风格编写,缩进的TAB键一个。 1-2:相对独立的程序块之间、变量说明之后必须加空行。 1-3:较长的语句(>80字符)要分成多行书写,长表达式要在低优先级操作符处划分新行,操作符放在新行之首,划分出的新行要进行适当的缩进,使排版整齐,语句可读。 1-4:循环、判断等语句中若有较长的表达式或语句,则要进行适应的划分,长表达式要在低优先级操作符处划分新行,操作符放在新行之首。 1-5:若函数或过程中的参数较长,则要进行适当的划分。 1-6:不允许把多个短语句写在一行中,即一行只写一条语句。 1-7:if、while、for、default、do等语句自占一行。 1-8:对齐只使用TAB键,不使用空格键。 1-9:函数或过程的开始、结构的定义及循环、判断等语句中的代码都要采用缩进风格,ca se语句下的情况处理语句也要遵从语句缩进要求。 1- 10:程序块的分界符(如C/C++语言的大括号'{'和'}')应各独占一行并且位于同一列,同时与引用它们的语句左对齐。在函数体的开始、类的定义、结构的定义、枚举的定义以及if、for、do、while0、switch、case语句中的程序都要采用如上的缩进方式。 1-11:在两个以上的关键字、变量、常量进行对等操作时,它们之间的操作符之前、之后或者前后要加空格;进行非对等操作时,如果是关系密切的立即操作符(如->),后不应加空格。 1-12: 程序结构清析,简单易懂,单个函数的程序行数不得超过100行。 A.2 注释 2-1:一般情况下,源程序有效注释量必须在20%以上。 2-2:说明性文件(如头文件.h文件、.inc文件、.def文件、编译说明文件.cfg等)头部应进行注释,注释必须列出:版权说明、版本号、生成日期、作者、内容、功能、与其它文件的关系、修改日志等,头文件的注释中还应有函数功能简要说明。 2-3:源文件头部应进行注释,列出:版权说明、版本号、生成日期、作者、模块目的/功能、主要函数及其功能、修改日志等。 2-4:函数头部应进行注释,列出:函数的目的/功能、输入参数、输出参数、返回值、调用关系(函数、表)等。 2-5:边写代码边注释,修改代码同时修改相应的注释,以保证注释与代码的一致性。不再有用的注释要删除。 2-6:注释的内容要清楚、明了,含义准确,防止注释二义性。 2-7:避免在注释中使用缩写,特别是非常用缩写。 2-8:注释应与其描述的代码相近,对代码的注释应放在其上方或右方(对单条语句的注释)相邻位置,不可放在下面,如放于上方则需与其上面的代码用空行隔开。 2-9:对于所有有物理含义的变量、常量,如果其命名不是充分自注释的,在声明时都必须加以注释,说明其物理含义。变量、常量、宏的注释应放在其上方相邻位置或右方。 2-10:数据结构声明(包括数组、结构、类、枚举等),如果其命名不是充分自注释的,必须加以注释。对数据结构的注释应放在其上方相邻位置,不可放在下面;对结构中的每个域的注释放在此域的右方。 2-11:全局变量要有较详细的注释,包括对其功能、取值范围、哪些函数或过程存取它以及存取时注意事项等的说明。

C语言基础知识(详细版)

C语言程序的结构认识 用一个简单的c 程序例子,介绍c 语言的基本构成、格式、以及良好的书写风格,使小伙伴对 c 语言有个 初步认识。 例1:计算两个整数之和的c 程序: #include main() { int a,b,sum; /* 定义变量a,b ,sum 为整型变量*/ a=20; /* 把整数20 赋值给整型变量a*/ b=15; /* 把整数15 赋值给整型变量b*/ sum=a+b; /* 把两个数之和赋值给整型变量sum*/ printf( “ a=%d,b=%d,sum=%d\n” ,a,b,sum); /* 把计算结果输出到显示屏上*/ } 重点说明: 1、任何一个c 语言程序都必须包括以下格式: main() { } 这是c 语言的基本结构,任何一个程序都必须包含这个结构。括号内可以不写任何内容,那么该程序将不执行任何结果。 2、main() - 在c 语言中称之为“主函数” ,一个c 程序有且仅有一个main 函数,任何一个c 程序总是从 main 函数开始执行,main 函数后面的一对圆括号不能省略。 3、被大括号{ }括起来的内容称为main 函数的函数体,这部分内容就是计算机要执行的内容。 4、在{ }里面每一句话后面都有一个分号(; ),在c 语言中,我们把以一个分号结尾的一句话叫做一个 c 语 言的语句,分号是语句结束的标志。 5、printf( “ a=%d,b=%d,sum=%d\n” ,a,b,sum); 通过执行这条c 语言系统提供给我们直接使用的屏幕输出 函数,用户即可看到运行结果,本程序运行后,将在显示器上显示如下结果: a=20,b=15,sum=35 6、#include 注意:(1)以#号开头 (2)不以分号结尾这一行没有分号,所以不是语句,在c 语言中称之为命令行,或者叫做“预编译处理命令” 。 7、程序中以/* 开头并且以*/ 结尾的部分表示程序的注释部分,注释可以添加在程序的任何位置,为了提高程序的可读性而添加,但计算机在执行主函数内容时完全忽略注释部分,换而言之就是计算机当做注释部分不存在于主函数中。 C程序的生成过程 C程序是先由源文件经编译生成目标文件,然后经过连接生成可执行文件。 源程序的扩展名为.c ,目标程序的扩展名为.obj , 可执行程序的扩展名为.exe 。

关于C语言编程书写规范的规则和建议

关于C语言编程书写规范的规则和建议 一、头文件 ?头文件由三部分内容组成: 1、头文件开头处的版权和版本声明。 2、预处理块。 3、函数和类结构声明等。 ?【规则】为了防止头文件被重复引用,应当用ifndef/define/endif结构产生预处理块。 ?【规则】用#include 格式来引用标准库的头文件(编译器将从标准库目录开始搜索). ?【规则】用#include “filename.h”格式来引用非标准库的头文件(编译器将从用户的工作目录开始搜索) ?【建议】头文件中只存放“声明”而不存放“定义” ?【建议】不提倡使用全局变量,尽量不要在头文件中出现象extern int value 这类声明。 二、程序的版式 空行 ?【规则】在每个类声明之后、每个函数定义结束之后都要加空行。 ?【规则】在一个函数体内,逻揖上密切相关的语句之间不加空行,其它地方应加空行分隔。 代码行 ?【规则】一行代码只做一件事情,如只定义一个变量,或只写一条语句。这样的代码容易阅读,并且方便于写注释。 ?【规则】if、for、while、do等语句自占一行,执行语句不得紧跟其后。不论执行语句有多少都要加{}。这样可以防止书写失误。 ?【建议】尽可能在定义变量的同时初始化该变量(就近原则) 代码行内的空格 ?【规则】关键字之后要留空格。象const、virtual、inline、case 等关键字之后至少要留一个空格,否则无法辨析关键字。象if、for、while等关键字之后应留一个空格再跟左括号‘(’,以突出关键字。 ?【规则】函数名之后不要留空格,紧跟左括号‘(’,以与关键字区别。 ?【规则】‘(’向后紧跟,‘)’、‘,’、‘;’向前紧跟,紧跟处不留空格。 ?【规则】‘,’之后要留空格,如Function(x, y, z)。如果‘;’不是一行的结束符号,其后要留空格。 ?【规则】赋值操作符、比较操作符、算术操作符、逻辑操作符、位域操作符,如“=”、“+=”“>=”、“<=”、“+”、“*”、“%”、“&&”、“||”、“<<”,“^”等二元操作符的前后应当加空格。 ?【规则】一元操作符如“!”、“~”、“++”、“--”、“&”(地址运算符)等前后不加空格。 ?【规则】象“[]”、“.”、“->”这类操作符前后不加空格。 ?【建议】对于表达式比较长的for语句和if语句,为了紧凑可以适当地去掉一些空格,如for (i=0; i<10; i++)和if ((a<=b) && (c<=d)) 对齐 ?【规则】程序的分界符‘{’和‘}’应独占一行并且位于同一列,同时与引用它们的语句左对齐。 ?【规则】{ }之内的代码块在‘{’右边数格处左对齐。 长行拆分 ?【规则】代码行最大长度宜控制在70至80个字符以内。代码行不要过长,否则眼睛看不过来,也不便于打印。 ?【规则】长表达式要在低优先级操作符处拆分成新行,操作符放在新行之首(以便突出操作符)。拆分出的新行要进行适当的缩进,使排版整齐,语句可读。

c语言规范5.0中文版

竭诚为您提供优质文档/双击可除c语言规范5.0中文版 篇一:c语言设计规范 篇二:关于c语言编程书写规范的规则和建议 关于c语言编程书写规范的规则和建议 一、头文件 1、头文件开头处的版权和版本声明。 2、预处理块。 3、函数和类结构声明等。头文件由三部分内容组成:【规则】为了防止头文件被重复引用,应当用 ifndef/define/endif结构产生预处理块。 【规则】用#include格式来引用标准库的头文件(编译器将从标准库目录开始搜索). 【规则】用#include“filename.h”格式来引用非标准库的头文件(编译器将从用户的工作目录开始搜索)【建议】头文件中只存放“声明”而不存放“定义” 【建议】不提倡使用全局变量,尽量不要在头文件中出现象externintvalue这类声明。 二、程序的版式 空行

【规则】在每个类声明之后、每个函数定义结束之后都要加空行。 【规则】在一个函数体内,逻揖上密切相关的语句之间不加空行,其它地方应加空行分隔。 代码行 【规则】一行代码只做一件事情,如只定义一个变量,或只写一条语句。这样的代码容易阅读,并且方便于写注释。【规则】if、for、while、do等语句自占一行,执行语句不得紧跟其后。不论执行语句有多少都要加{}。这样可以防止书写失误。【建议】尽可能在定义变量的同时初始化该变量(就近原则) 代码行内的空格 【规则】关键字之后要留空格。象const、virtual、inline、case等关键字之后至少要留一个空格,否则无法辨析关键字。象if、for、while等关键字之后应留一个空格再跟左括号 ‘(’,以突出关键字。 【规则】函数名之后不要留空格,紧跟左括号‘(’,以与关键字区别。 【规则】‘(’向后紧跟,‘)’、‘,’、‘;’向前紧跟,紧跟处不留空格。 【规则】‘,’之后要留空格,如Function(x,y,z)。如 果‘;’不是一行的结束符号,其后要留空格。

C语言软件编写规范

C语言软件编写规范 以下是为大家整理的c语言软件编写规范的相关范文,本文关键词为语言,软件,编写,规范,北京,森馥,科技,股份有限公司,前言,您可以从右上方搜索框检索更多相关文章,如果您觉得有用,请继续关注我们并推荐给您的好友,您可以在教育文库中查看更多范文。 北京森馥科技股份有限公司 前言: 一个好的程序编写规范是编写高质量程序的保证。清晰、规范的源程序不仅仅是方便阅读,更重要的是能够便于检查错误,提高调试

效率,从而最终保证软件的质量和可维护性。 说明: 本规范适用于公司内使用c语言编码的所有软件。本规范自发布之日起生效,以后新编写的和修改的代码应遵守本规范。 注:使用固件和操作系统源代码应保留其代码风格 1 北京森馥科技股份有限公司 目录 1.排版与格式................................................................................................................. ....................................32.标识符命名与定义................................................................................................................. ........................43.注释书写规范................................................................................................................. .. (6) 2 北京森馥科技股份有限公司 1.排版与格式 规则1:程序块采用缩进风格编写,每级缩进为4个空格。 程序块采用缩进风格编写,每级缩进为4个空格,不使用TAb键,

c语言代码书写规范

c语言代码书写规范 篇一:关于C语言编程书写规范的规则和建议 关于C语言编程书写规范的规则和建议 一、头文件 1、头文件开头处的版权和版本声明。 2、预处理块。 3、函数和类结构声明等。 ? 头文件由三部分内容组成: ? 【规则】为了防止头文件被重复引用,应当用ifndef/define/endif结构产生预处理块。 ? 【规则】用 #include 格式来引用标准库的头文件(编译器将从标准库目录开始搜索). ? 【规则】用 #include “”格式来引用非标准库的头文件(编译器将从用户的工作目录开始搜索) ? 【建议】头文件中只存放“声明”而不存放“定义” ? 【建议】不提倡使用全局变量,尽量不要在头文件中出现象extern int value 这类声明。 二、程序的版式 空行 ? 【规则】在每个类声明之后、每个函数定义结束之

后都要加空行。 ? 【规则】在一个函数体内,逻揖上密切相关的语句之间不加空行,其它地方应加空行分隔。 代码行 ? 【规则】一行代码只做一件事情,如只定义一个变量,或只写一条语句。这样的代码容易阅读,并且方便于写注释。 ? 【规则】if、for、while、do等语句自占一行,执行语句不得紧跟其后。不论执行语句有多少都要加{}。这样可以防止书写失误。 ? 【建议】尽可能在定义变量的同时初始化该变量(就近原则) 代码行内的空格 ? 【规则】关键字之后要留空格。象const、virtual、inline、case 等关键字之后至少要留一个空格,否则无法辨析关键字。象if、for、while等关键字之后应留一个空格再跟左括号‘(’,以突出关键字。 ? 【规则】函数名之后不要留空格,紧跟左括号‘(’,以与关键字区别。 ? 【规则】‘(’向后紧跟,‘)’、‘,’、‘;’向前紧跟,紧跟处不留空格。

标准C语言规范

C语言编码规范 1.文件、函数规范 根据功能划分文件。文件名与主控函数名相同;主控函数必须放在最前面;函数的长度一般不宜超过150行;文件长度不宜超过500行。标准的文件头格式如下: 函数名: 功能: 调用函数:所涉及的主要功能函数 调用参数:必须详细说明 返回值: 编写时间: 修改时间:修改时包含此项 2.命名规范 ①函数命名规范 以便于理解为原则,由一个或多个单词或单词缩写组合而成,单词首字母大写。 如AddItem(),GetInt(),FxaUp() ②变量命名规范 由变量类型为前缀,加上函数命名规范组合而成。具体前缀命名方法如下:sh------short, i------int, l------long, c------char, f------float, d------double, p------pointer 字符串数组也使用p标志 静态变量名前用s标志 数组变量名前用stru标志 全局变量使用前缀g_标志 如:dBalance,fInterest,pName, sCustomer,struPersonWang, g_iOperNo 3.书写规范 ⑴对齐原则 同一层次的语句必须左对齐。“{”和“}”必须独占一行。 ⑵缩进原则 不同层次的语句必须遵从缩进原则,一般缩进四个字符为宜,TAB值设为4。 Case后的语句(简短注释语句除外)应另起一行,且须与“:”相接。 ⑶分行书写原则 当行超过屏幕上的行时,应分行书写。 ⑷注释符要求 单行注释符使用“//”,多行注释符使用“/*……*/”,注释符必须遵从前面3条原则,“/*”应与“*/”对齐。 4.语法规范

C语言头文件作用及写法

C语言头文件作用及写法 头文件几个好处: 1,头文件可以定义所用的函数列表,方便查阅你可以调用的函数; 2,头文件可以定义很多宏定义,就是一些全局静态变量的定义,在这样的情况下,只要修改头文件的内容,程序就可以做相应的修改,不用亲自跑到繁琐的代码内去搜索。 3,头文件只是声明,不占内存空间,要知道其执行过程,要看你头文件所申明的函数是在哪个.c文件里定义的,才知道。 4,他并不是C自带的,可以不用。 5,调用了头文件,就等于赋予了调用某些函数的权限,如果你要算一个数的N次方,就要调用Pow()函数,而这个函数是定义在math.c里面的,要用这个函数,就必需调用math.h 这个头文件。 头文件写法: #include ... //------------------------------- #ifndef MY_POINT #define MY_POINT class Class1 { } class Class2 { } ... #endif 在要使用类定义的文件中加入 #include "头文件名.h " 一般来说,头文件里多数是放的函数定义或函数体。 此外,还有: #ifndef **** #define **** …… #endif 之类的语句,用于控制#define 与#endif之间的内容不被重复定义或插入。 #include 语句起的只是一个插入作用。 也就是说,#include 的文件里的内容可以随便写。 编译器使用#include 的文件里的内容来插入到#include 所在位置。 所以,你说的“头文件”没有固定格式。

如要使用其它头文件中的函数,可以直接在你的头文件中引用。 初学C语言,个人建议你使用C++Builder 6去练习和理解,当然,这要求你有一定的英语水平.在很多情况下会自动的帮你加好头文件,你可以观察它自动生成的文件,代码,以进一步学习。 example: 我截了一小段 /* math.h Definitions for the math floating point package. Copyright (c) 1987, 1991 by Borland International All Rights Reserved. */ #ifndef __MATH_H #define __MATH_H #if !defined( __DEFS_H ) #include <_defs.h> #endif #define HUGE_VAL _huge_dble extern double _Cdecl _huge_dble; #define _LHUGE_VAL _huge_ldble extern long double _Cdecl _huge_ldble; #ifdef __cplusplus extern "C" { #endif double _Cdecl acos (double __x); double _Cdecl asin (double __x); double _Cdecl atan (double __x); double _Cdecl atan2 (double __y, double __x); double _Cdecl ceil (double __x); double _Cdecl cos (double __x); double _Cdecl cosh (double __x); double _Cdecl exp (double __x); double _Cdecl fabs (double __x); double _Cdecl __fabs__ (double __x); /* Intrinsic */ double _Cdecl floor (double __x); double _Cdecl fmod (double __x, double __y); double _Cdecl frexp (double __x, int *__exponent);

c语言格式书写规范

如对您有帮助,请购买打赏,谢谢您! C语言书写规范指南 第1章文件结构 每个C程序通常分为两个文件。一个文件用于保存程序的声明(declaration),称为头文件。另一个文件用于保存程序的实现(implementation),称为定义(definition)文件。 C程序的头文件以“.h”为后缀,C程序的定义文件以“.c”为后缀。 1.1版权和版本的声明 版权和版本的声明位于头文件和定义文件的开头(参见示例1-1),主要内容有: (1)版权信息。 (2)文件名称,标识符,摘要。 (3)当前版本号,作者/修改者,完成日期。 (4)版本历史信息。 /* *Copyright(c)2001,吉林大学物理学院无线电 *Allrightsreserved. * *文件名称:filename.h *文件标识: *摘要:简要描述本文件的内容 * *当前版本:1.1 *作者:输入作者(或修改者)名字 *完成日期:2007年7月20日 * *取代版本:1.0 *原作者:输入原作者(或修改者)名字 *完成日期:2007年5月10日 */ 示例1-1版权和版本的声明 1.2头文件的结构 头文件由三部分内容组成: (1)头文件开头处的版权和版本声明(参见示例1-1)。 (2)预处理块。 (3)函数和类结构声明等。 假设头文件名称为SCL_SPI.h,头文件的结构参见示例1-2。 【规则1-2-1】为了防止头文件被重复引用,应当用#ifndef/#define/#endif结构产生预处理块。 【规则1-2-2】用#include 格式来引用标准库的头文件(编译器将从标准库目录开始搜索)。 【规则1-2-3】用#include “filename.h”格式来引用非标准库的头文件(编译器将从用户的工作目录开始搜索)。 【规则1-2-4】#include 后面使用TAB键控制排版。 【规则1-2-5】头文件中只存放“声明”而不存放“定义”

C语言头文件的使用与写法

C语言头文件的使用与写法。 2009年04月20日星期一23:12 C语言中的.h文件和我认识由来已久,其使用方法虽不十分复杂,但我却是经过了几个月的“不懂”时期,几年的“一知半解”时期才逐渐认识清楚他的本来面目。揪其原因,我的驽钝和好学而不求甚解固然是原因之一,但另外还有其他原因。原因一:对于较小的项目,其作用不易被充分开发,换句话说就是即使不知道他的详细使用方法,项目照样进行,程序在计算机上照样跑。原因二:现在的各种C语言书籍都是只对C语言的语法进行详细的不能再详细的说明,但对于整个程序的文件组织构架却只字不提,找了好几本比较著名的C语言著作,却没有一个把.h文件的用法写的比较透彻的。下面我就斗胆提笔,来按照我对.h 的认识思路,向大家介绍一下。 让我们的思绪乘着时间机器回到大学一年级。C原来老师正在讲台上讲着我们的第一个C语言程序: Hello world! 文件名 First.c main() { printf(“Hello world!”); } 例程-1 看看上面的程序,没有.h文件。是的,就是没有,世界上的万物都是经历从没有到有的过程的,我们对.h的认识,我想也需要从这个步骤开始。这时确实不需要.h文件,因为这个程序太简单了,根本就不需要。那么如何才能需要呢?让我们把这个程序变得稍微复杂些,请看下面这个, 文件名 First.c printStr() { printf(“Hello world!”); } main() {

printStr() } 例程-2 还是没有, 那就让我们把这个程序再稍微改动一下. 文件名 First.c main() { printStr() } printStr() { printf(“Hello world!”); } 例程-3 等等,不就是改变了个顺序嘛, 但结果确是十分不同的. 让我们编译一下例程-2 和例程-3,你会发现例程-3是编译不过的.这时需要我们来认识一下另一个C语言中的概念:作用域. 我们在这里只讲述与.h文件相关的顶层作用域, 顶层作用域就是从声明点延伸到源程序文本结束, 就printStr()这个函数来说,他没有单独的声明,只有定义,那么就从他定义的行开始,到first.c文件结束, 也就是说,在在例程-2的main()函数的引用点上,已经是他的作用域. 例程-3的main()函数的引用点上,还不是他的作用域,所以会编译出错. 这种情况怎么办呢? 有两种方法 ,一个就是让我们回到例程-2, 顺序对我们来说没什么, 谁先谁后不一样呢,只要能编译通过,程序能运行, 就让main()文件总是放到最后吧. 那就让我们来看另一个 例程,让我们看看这个方法是不是在任何时候都会起作用. 文件名 First.c play2()

如何规范书写C语言编码

如何规范书写C语言编码 [摘要]随着我国经济的不断发展,计算机专业毕业生有很广阔的就业市场,然而计算机行业人才济济,就业竞争激烈,中职学校的计算机专业学生就不能局限于计算机基础知识、Office办公软件、Photoshop、flash 等的学习,C语言的学习也是有必要的。本文主要浅谈了中职生如何规范书写C语言编码。 [关键词]C语言,板书规范,代码 为拓展中职学生的就业渠道,C语言课程的学习必不可少。C程序设计是计算机应用人员应掌握的基本功,是计算机软件开发的入门语言,主要培养学生算法设计的基本思想和程序设计的基本技能。C语言的基本知识非常重要,学好C语言不仅要学好理论知识,它的书写规范也是非常重要的。好的书写规范能够大大提高程序的可读性和维护性。 一个C程序也有其一般结构,我把它归纳成下面格式: #include void main( ) { int,float,char,double; //定义变量 scanf( ); //输入数据 x=3; //赋值语句 if-else;switch;for;while;do-while; //处理数据 printf( ); //输出语句 } 对中职生来说C程序设计要求比较简单,首先需要其掌握C语言程序的基本结构,按照以上格式根据具体情况填入相应内容即可。这里对于函数scanf、printf以及if语句、while语句、for语句的使用我们就不具体介绍了。现将多年来教学过程中学生们编程时出现的问题,谈谈如何规范书写C语言编码。 一、板书规范 程序的板书虽然不会影响程序的功能,但会影响可读性。程序的板书清晰、美观,是程序风格的重要构成因素。 1、空行 空行起着分隔程序段落的作用。如果定义多个函数,函数之间需要使用空行。 2、缩进 程序编写时应采用缩进格式,缩进为四个空格位。缩进让程序具有层次感,清晰易读。

C语言编程规范之misrac

…安全第一?的C语言编程规范 作者:清华大学陈萌萌邵贝贝 编者按:C语言是开发嵌入式应用的主要工具,然而C语言并非是专门为嵌入式系统设计,相当多的嵌入式系统较一般计算机系统对软件安全性有更苛刻的要求。1998年,MISRA指出,一些在C看来可以接受,却存在安全隐患的地方有127处之多。2004年,MISRA对C的限制增加到141条。 嵌入式系统应用工程师借用计算机专家创建的C语言,使嵌入式系统应用得以飞速发展,而MISRAC 是嵌入式系统应用工程师对C语言嵌入式应用做出的贡献。如今MISRA C已经被越来越多的企业接受,成为用于嵌入式系统的C语言标准,特别是对安全性要求极高的嵌入式系统,软件应符合MISRA标准。 从本期开始,本刊将分6期,与读者共同学习MISRAC。 第一讲:“…安全第一?的C语言编程规范”,简述MISRAC的概况。 第二讲:“跨越数据类型的重重陷阱”,介绍规范的数据定义和操作方式,重点在隐式数据类型转换中的问题。 第三讲:“指针、结构体、联合体的安全规范”,解析如何安全而高效地应用指针、结构体和联合体。 第四讲:“防范表达式的失控”,剖析MISRAC中关于表达式、函数声明和定义等的不良使用习惯,最大限度地减小各类潜在错误。 第五讲:“准确的程序流控制”,表述C语言中控制表达式和程序流控制的规范做法。 第六讲:“构建安全的编译环境”,讲解与编译器相关的规范编写方式,避免来自编译器的隐患。 C/C++语言无疑是当今嵌入式开发中最为常见的语言。早期的嵌入式程序大都是用汇编语言开发的,但人们很快就意识到汇编语言所带来的问题——难移植、难复用、难维护和可读性极差。很多程序会因为当初开发人员的离开而必须重新编写,许多程序员甚至连他们自己几个月前写成的代码都看不懂。C/C++语言恰恰可以解决这些问题。作为一种相对“低级”的高级语言,C/C++语言能够让嵌入式程序员更自由地控制底层硬件,同时享受高级语言带来的便利。对于C语言和C++语言,很多的程序员会选择C语言,而避开庞大复杂的C++语言。这是很容易理解的——C语言写成的代码量比C++语言的更小些,执行效率也更高。 对于程序员来说,能工作的代码并不等于“好”的代码。“好”代码的指标很多,包括易读、易维护、易移植和可靠等。其中,可靠性对嵌入式系统非常重要,尤其是在那些对安全性要求很高的系统中,如飞行器、汽车和工业控制中。这些系统的特点是:只要工作稍有偏差,就有可能造成重大损失或者人员伤亡。一个不容易出错的系统,除了要有很好的硬件设计(如电磁兼容性),还要有很健壮或者说“安全”的程序。 然而,很少有程序员知道什么样的程序是安全的程序。很多程序只是表面上可以干活,还存在着大量的隐患。当然,这其中也有C语言自身的原因。因为C语言是一门难以掌握的语言,其灵活的编程方式和语法规则对于一个新手来说很可能会成为机关重重的陷阱。同时,C语言的定义还并不完全,即使是国际通用的C语言标准,也还存在着很多未完全定义的地方。要求所有的嵌入式程序员都成为C语言专家,避开所有可能带来危险的编程方式,是不现实的。最好的方法是有一个针对安全性的C语言编程规范,告诉程序员该如何做。 1 MISRAC规范 1994年,在英国成立了一个叫做汽车工业软件可靠性联合会(The Motor Industry Software Reliability Association,以下简称MISRA)的组织。它是致力于协助汽车厂商开发安全可靠的软件的跨国协会,其成员包括:AB汽车电子、罗孚汽车、宾利汽车、福特汽车、捷豹汽车、路虎公司、Lotus公司、MIRA公司、Ricardo公司、TRW汽车电子、利兹大学和福特VISTEON汽车系统公司。 经过了四年的研究和准备,MISRA于1998年发布了一个针对汽车工业软件安全性的C语言编程规范——《汽车专用软件的C语言编程指南》(Guidelines for the Use of the C Language in Vehicle Based Software),共有127条规则,称为MISRAC:1998。

相关文档
最新文档