縮進(jìn)
- 使用4個(gè)空格進(jìn)行縮進(jìn)
- 使用空格,不要使用Tab來縮進(jìn)
變量聲明
- 每個(gè)變量聲明使用單獨(dú)一行
- 避免使用過于簡化或沒有意義的名稱(如商蕴,"a", "rbarr", "nughdeget")
- 單字符的變量名僅僅在含義非常明顯的場景可以使用绪商,如計(jì)數(shù)或臨時(shí)字符
// 錯(cuò)誤
int a, b;
char *c, *d;
// 正確
int height;
int width;
char *nameOfThis;
char *nameOfThat;
- 只要在需要時(shí)才聲明變量
- 變量名和方法明使用小寫字母開頭,后面連續(xù)的單詞首字母大寫例书。
- 不要使用縮略
// 錯(cuò)誤
short Cntr;
char ITEM_DELIM = ' ';
// 正確
short counter;
char itemDelimiter = ' ';
- 類名稱永遠(yuǎn)使用大寫字母開頭。公開類以'Q'開頭织狐,后接大寫字母(QRgb)旺嬉。公共方法通常以'q'開頭(qRgb)邪媳。
- 縮略詞在開頭的也是用駝峰樣式(如荡陷,QXmlStreamReader, 而不是 QXMLStreamReader)徽龟。
空格
- 使用空行將語句組合在適合的地方
- 始終只使用一個(gè)空白行
- 始終在關(guān)鍵字之后和大括號之前添加一個(gè)空格:
// 錯(cuò)誤
if(foo){
}
// 正確
if (foo) {
}
- 對于指針或引用,始終在類型和“”或“&”之間使用單個(gè)空格极颓,但在“”或“&”與變量名稱之間不要有空格。
char *x;
const QString &myString;
const char * const y = "hello";
- 在二元運(yùn)算符前后添加空格
- 在類型轉(zhuǎn)換關(guān)鍵詞后不要添加空格
- 盡量避免使用C風(fēng)格的類型轉(zhuǎn)換
// 錯(cuò)誤
char* blockOfMemory = (char* ) malloc(data.size());
// 正確
char *blockOfMemory = reinterpret_cast<char *>(malloc(data.size()));
- 不要把多個(gè)語句放在一行上
- 通過擴(kuò)展,對控制流程語句的主體使用一個(gè)新行:(原句:By extension, use a new line for the body of a control flow statement:)
// 錯(cuò)誤
if (foo) bar();
// 正確
if (foo)
bar();
大括號
- 使用緊連的大括號:大括號與聲明的開頭位于同一行。 如果右大括號后跟另一個(gè)關(guān)鍵字,也要放在一行中:
// 錯(cuò)誤
if (codec)
{
}
else
{
}
// 正確
if (codec) {
} else {
}
- 例外:函數(shù)實(shí)現(xiàn)(但不是lambda表達(dá)式)和類聲明始終在新行行首添加左括號:
static void foo(int g)
{
qDebug("foo: %i", g);
}
class Moo
{
};
- 僅當(dāng)條件語句的主體包含多行時(shí)才使用花括號:
// 錯(cuò)誤
if (address.isEmpty()) {
return false;
}
for (int i = 0; i < 10; ++i) {
qDebug("%i", i);
}
// 正確
if (address.isEmpty())
return false;
for (int i = 0; i < 10; ++i)
qDebug("%i", i);
- 例外1:如果父語句包含多行/換行符,也使用大括號:
// 正確
if (address.isEmpty() || !isValid()
|| !codec) {
return false;
}
- 例外2:括號對稱性:在if-then-else塊中使用大括號,不管if的主體或else的主體有幾行:
// 錯(cuò)誤
if (address.isEmpty())
qDebug("empty!");
else {
qDebug("%s", qPrintable(address));
it;
}
// 正確
if (address.isEmpty()) {
qDebug("empty!");
} else {
qDebug("%s", qPrintable(address));
it;
}
// 錯(cuò)誤
if (a)
…
else
if (b)
…
// 正確
if (a) {
…
} else {
if (b)
…
}
- 當(dāng)條件語句的主體為空時(shí)盼砍,使用花括號
// 錯(cuò)誤
while (a);
// 正確
while (a) {}
小括號
- 使用小括號將表達(dá)式分組:
// 錯(cuò)誤
if (a && b || c)
// 正確
if ((a && b) || c)
// 錯(cuò)誤
a + b & c
// 正確
(a + b) & c
switch語句
- case關(guān)鍵詞與switch位于同一列
- 每個(gè)case最后都必須有一個(gè)break(或return)語句浇坐,或者使用Q_FALLTHROUGH()來表示有意不中斷,除非要后面緊接另一個(gè)case的內(nèi)容觉渴。
switch (myEnum) {
case Value1:
doSomething();
break;
case Value2:
case Value3:
doSomethingElse();
Q_FALLTHROUGH();
default:
defaultHandling();
break;
}
跳轉(zhuǎn)語句 (break, continue, return, and goto)
- 不要將else放在在跳轉(zhuǎn)語句的后面:
// 錯(cuò)誤
if (thisOrThat)
return;
else
somethingElse();
// 正確
if (thisOrThat)
return;
somethingElse();
- 例外:如果代碼本身是對稱的,則允許使用else來顯示對稱性
換行
- 保持一行少于100個(gè)字符; 如有必要?jiǎng)t折行
- 注釋/ apidoc行應(yīng)保持在實(shí)際文本的80列以下。 根據(jù)周圍內(nèi)容進(jìn)行調(diào)整漱挚,避免“鋸齒”段落的方式(原文:Comment/apidoc lines should be kept below 80 columns of actual text. Adjust to the surroundings, and try to flow the text in a way that avoids "jagged" paragraphs.)
- 逗號在被折斷行的行尾旨涝,操作符在新行的行首。操作符在行尾很容易被隱藏起來弧腥,如果編輯器比較窄的話。
// 錯(cuò)誤
if (longExpression +
otherLongExpression +
otherOtherLongExpression) {
}
// 正確
if (longExpression
+ otherLongExpression
+ otherOtherLongExpression) {
}
一般例外
- 當(dāng)嚴(yán)格遵守規(guī)則使你的代碼看起來很糟糕的時(shí)候更鲁,不要遵守
風(fēng)格藝術(shù)
可以使用下面的代碼風(fēng)格使得你的代碼更有藝術(shù)性
--style=kr
--indent=spaces=4
--align-pointer=name
--align-reference=name
--convert-tabs
--attach-namespaces
--max-code-length=100
--max-instatement-indent=120
--pad-header
--pad-oper
請注意澡为,“無限制”--max-instatement-indent僅用于astyle媒至,因?yàn)槿绻罄m(xù)行需要縮進(jìn)限制筋夏,astyle不夠智能以包裝第一個(gè)參數(shù)。 鼓勵(lì)您手動(dòng)限制在語句縮進(jìn)大約50個(gè)列:(原文:Note that "unlimited" --max-instatement-indent is used only because astyle is not smart enough to wrap the first argument if subsequent lines would need indentation limitation. You are encouraged to manually limit in-statement-indent to roughly 50 colums:)
int foo = some_really_long_function_name(and_another_one_to_drive_the_point_home(
first_argument, second_argument, third_arugment));
官方原文鏈接