一份不錯(cuò)的嵌入式C編碼規(guī)范_第1頁
一份不錯(cuò)的嵌入式C編碼規(guī)范_第2頁
一份不錯(cuò)的嵌入式C編碼規(guī)范_第3頁
一份不錯(cuò)的嵌入式C編碼規(guī)范_第4頁
一份不錯(cuò)的嵌入式C編碼規(guī)范_第5頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

第第頁一份不錯(cuò)的嵌入式C編碼規(guī)范最重要的一條規(guī)則

編寫代碼時(shí)最重要的一條規(guī)則是:檢查周圍的代碼并嘗試模仿它。

作為維護(hù)人員,如果收到的補(bǔ)丁明顯與周圍代碼的編碼風(fēng)格不同,這是令人沮喪的。這是不尊重人的,就像某人穿著泥濘的鞋子走進(jìn)一間一塵不染的房子。

因此,無論本文(推薦)的是什么,如果已經(jīng)編寫了代碼并且您正在對其進(jìn)行修補(bǔ),請保持其當(dāng)前的樣式一致,即使它不是您最喜歡的樣式。

一般規(guī)則

這里列出了最明顯和最重要的一般規(guī)則。在你繼續(xù)閱讀其他章節(jié)之前,請仔細(xì)檢查它們。

使用C99標(biāo)準(zhǔn)

不使用制表符,而是使用空格

每個(gè)縮進(jìn)級別使用4個(gè)空格

在關(guān)鍵字和左括號之間使用一個(gè)空格

在函數(shù)名和左括號之間不要使用空格

int32_t

a

=

sum(4,

3);

/*

OK

*/int32_t

a

=

sum

(4,

3);

/*

Wrong

*/

當(dāng)函數(shù)可以接受任何類型的指針時(shí),總是使用void*,不要使用uint8_t*。函數(shù)在實(shí)現(xiàn)時(shí)必須注意正確的類型轉(zhuǎn)換

/*

*

To

send

data,

function

should

not

modify

memory

poin(te)d

to

by

`data`

variable

*

thus

`const`

keyword

is

important

*

*

To

send

generic

data

(or

to

write

them

to

file)

*

any

type

may

be

passed

for

data,

*

thus

use

`void

*`

*//*

OK

example

*/voidsend_data(const

void*

data,

size_t

len)

{

/*

OK

*/

/*

Do

not

cast

`void

*`

or

`const

void

*`

*/

const

uint8_t*

d

=

data;/*

Function

handles

proper

type

for

internal

usage

*/}voidsend_data(const

void*

data,

int

len)

{

/*

Wrong,

not

not

use

int

*/}

對于解釋,總是使用/*comment*/,即使是單行解釋

在頭文件中總是包含帶有extern關(guān)鍵字的(c++)檢查

每個(gè)函數(shù)都必須包含doxygen-enabled解釋,即使函數(shù)是靜態(tài)的

使用英文名稱/文本的函數(shù),變量,解釋

變量使用小寫字母

如果變量包含多個(gè)名稱,請使用下劃線。force_redraw。不要使用forceRedraw

對于C標(biāo)準(zhǔn)庫的包含文件,請始終使用

用星號聲明指針變量與類型對齊

/*

OK

*/char*

a;/*

Wrong

*/char

*a;char

*

a;

宏和預(yù)處理指令

總是使用宏而不是文字常量,特別是對于數(shù)字

所有的宏必須是全大寫的,并帶有下劃線_字符(可選),除非它們被明確標(biāo)記為function,將來可能會被常規(guī)函數(shù)語法替換

/*

OK

*/#define

MY_MACRO(x)

((x)

*

(x))/*

Wrong

*/#define

square(x)

((x)

*

(x))

不縮進(jìn)子語句內(nèi)#if語句

/*

OK

*/#if

defined(XYZ)#if

defined(ABC)/*

do

when

ABC

defined

*/#endif

/*

defined(ABC)

*/#else

/*

defined(XYZ)

*//*

Do

when

XYZ

not

defined

*/#endif

/*

!defined(XYZ)

*//*

Wrong

*/#if

defined(XYZ)

#if

defined(ABC)

/*

do

when

ABC

defined

*/

#endif

/*

defined(ABC)

*/#else

/*

defined(XYZ)

*/

/*

Do

when

XYZ

not

defined

*/#endif

/*

!defined(XYZ)

*/

如果函數(shù)返回枚舉的成員,則使用ref關(guān)鍵字指定哪個(gè)成員

/**

*

rief

My

enumeration

*/typedef

enum

{

MY_ERR,

/*!

對常量或數(shù)字使用符號('NULL'=>NULL)

/**

*

rief

Get

data

from

input

array

*

param[in]

in:

Input

data

*

eturn

Pointer

to

output

data

on

success,

`NULL`

otherwise

*/const

void

*get_data(const

void*

in)

{

return

in;}

宏的文檔必須包括hideinitializerdoxygen命令

/**

*

rief

Get

minimal

value

between

`x`

and

`y`

*

param[in]

x:

First

value

*

param[in]

y:

Second

value

*

eturn

Minimal

value

between

`x`

and

`y`

*

hideinitializer

*/#define

MIN(x,

y)

((x)

頭/源文件

在文件末尾留下一個(gè)空行

每個(gè)文件都必須包括文件的doxygen解釋和后跟空行的簡要描述(使用doxygen時(shí))

/**

*

file

template.h

*

rief

Template

include

file

*/

/*

Here

is

empty

line

*/

每個(gè)文件(頭文件或源文件)必須包含許可證(開始解釋包括單個(gè)星號,因?yàn)閐oxygen必須忽略這個(gè))

使用與項(xiàng)目/庫已經(jīng)使用的相同的許可證

/**

*

file

template.h

*

rief

Template

include

file

*//*

*

Copyright

(c)

year

FirstName

LASTNAME

*

*

Permission

is

hereby

granted,

free

of

charge,

to

any

person

*

obtaining

a

copy

of

this

software

and

associated

documentation

*

files

(the

"Software"),

to

deal

in

the

Software

without

restriction,

*

including

without

limitation

the

rights

to

use,

copy,

modify,

merge,

*

publish,

distribute,

(sub)license,

and/or

sell

copies

of

the

Software,

*

and

to

permit

persons

to

whom

the

Software

is

furnished

to

do

so,

*

subject

to

the

following

conditions:

*

*

The

above

copyright

notice

and

this

permission

notice

shall

be

*

included

in

all

copies

or

substantial

portions

of

the

Software.

*

*

THE

SOFTWARE

IS

PROVIDED

"AS

IS",

WITHOUT

WARRANTY

OF

ANY

KIND,

*

EXPRESS

OR

IMPLIED,

INCLUDING

BUT

NOT

LIMITED

TO

THE

WARRANTIES

*

OF

MERCHANTABILITY,

FITNESS

FOR

A

PARTICULAR

PURPOSE

*

AND

NONINFRINGEMENT.

IN

NO

EVENT

SHALL

THE

AUTHORS

OR

COPYRIGHT

*

HOLDERS

BE

LIABLE

FOR

ANY

CLAIM,

DAMAGES

OR

OTHER

LIABILITY,

*

WHETHER

IN

AN

ACTION

OF

CONTRACT,

TORT

OR

OTHERWISE,

ARISING

*

FROM,

OUT

OF

OR

IN

CONNECTION

WITH

THE

SOFTWARE

OR

THE

USE

OR

*

OTHER

DEALINGS

IN

THE

SOFTWARE.

*

*

This

file

is

part

of

library_name.

*

*

Author:

FirstName

LASTNAME

*/

頭文件必須包含保護(hù)符#ifndef

頭文件必須包含c++檢查

在c++檢查之外包含外部頭文件

首先用STLC文件包含外部頭文件,然后是應(yīng)用程序自定義文件

頭文件必須包含其他所有頭文件,以便正確編譯,但不能包含更多頭文件(如果需要,.c應(yīng)該包含其余的頭文件)

頭文件必須只公開模塊公共變量/類型/函數(shù)

在頭文件中使用extern作為全局模塊變量,稍后在源文件中定義它們

/*

file.h

...

*/#ifndef

...extern

int32_t

my_variable;

/*

This

is

global

variable

declaration

in

header

*/#endif/*

file.c

...

*/int32_t

my_variable;

/*

Actually

defined

in

source

*/

不要把.c文件包含在另一個(gè).c文件中

.c文件應(yīng)該首先包含相應(yīng)的.h文件,然后是其他文件,除非另有明確的必要

在頭文件中不包含模塊私有聲明

頭文件示例(示例中沒有l(wèi)icense)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論