C++ Coding Convention
SVTH: Tiêu Mỹ Hồng – 51303297
Đoàn Thị Huyền Trang – 51303186
Khoa: Công Nghệ Thông Tin
1
C++ Coding Convention
I.
CHUẨN VIẾT CODE TRONG C++
1.
Tổ chức chương trình
2.
Chuẩn tài liệu
II.
CÁC LỖI THƯỜNG GẶP TRONG C++
III. CÔNG CỤ KIỂM TRA TỰ ĐỘNG CODE CÓ VIẾT ĐÚNG
CHUẨN HAY KHÔNG
1.
Giới thiệu về công cụ hỗ trợ kiểm tra chuẩn viết Code – Cppcheck –
trong C++
2.
Mục đích sử dụng của Cppcheck
2
C++ Coding Convention
I.Chuẩn viết code trong C++
C++ (đọc là "C cộng cộng" hay "xi-plus-plus", IPA: /siː pləs pləs/) là một loại ngôn
ngữ lập trình. Đây là một dạng ngôn ngữ đa mẫu hình tự do có kiểu tĩnh và hỗ
trợ lập trình thủ tục, dữ liệu trừu trượng, lập trình hướng đối tượng, và lập trình
đa hình.
3
C++ Coding Convention
I.Chuẩn viết code trong C++
1.Tổ chức chương trình
Môđun hóa chương trình:
- Chương trình nên được tách thành nhiều môđun, mỗi môđun nên thực hiện
một công việc và càng độc lập nhau càng tốt. Điều này sẽ giúp dễ bảo dưỡng
chương trình hơn.
- Khi chuyển thông tin cho chương trình con nên sử dụng các tham số để tạo
tính độc lâp và dễ dàng kiểm soát giá trị của chúng khi chương trình thi hành.
4
C++ Coding Convention
Định nghĩa và cài đặt:
- Định nghĩa và cài đặt của các lớp phải được chia thành nhiều file để có thể
dễ dàng tái sử dụng
- Định nghĩa các lớp được lưu trong file header với mở rộng *.h. Cài đặt
của các thành viên của lớp lưu trong file nguồn với mở rộng *.cpp
- Mỗi file header của lớp nên sử dụng các định hướng #ifndef, #define, và
#endif để đảm bảo mỗi file header chỉ được include một lần.
5
C++ Coding Convention
2. Chuẩn tài liệu
Chú thích:
- Sử dụng // cho các dòng chú thích. Chỉ dùng /* */ để tạm thời vô hiệu hóa
cho các đoạn chương trình test hoặc debug.
- Mỗi file nguồn cả .cpp và .h đều phải bắt đầu bằng một khối chú thích đủ để
người đọc có thể kết nối các file nếu chúng bị tách ra.
- Mỗi lớp hàm , phương thức phải có một khối chú thích mô tả ngắn gọn lớp,
hàm, phương thức.
- Có thể chú thích các đoạn code bên trong hàm, tuy nhiên chỉ nên chú thích đủ
hiểu. Quá nhiều chú thích và chú thích thừa làm code trông rối.
C++ Coding Convention
Tên gọi
- Sử dụng các tên có nghĩa
- Đặt tên một cách nhất quán
- Tên của các project, form, và component sinh bởi môi trường lập trình.
- Tên biến và tên hàm thường phải là các từ hoặc cụm từ.
- Không được viết tắt trừ các từ viết thông dụng như HTML, khi đó coi từ viết
tắt như từ thông thường ( tên sẽ có dạng convertToHtml thay vì
convertToHTML)
7
C++ Coding Convention
-
Đặt tên cho các namespace bằng chữ in thường.
Vd: mynamespace
-
Tên biến là một danh từ bắt đầu bằng một kí tự in thường , các từ tiếp theo bắt đầu
bằng một kí tự in hoa
Vd: audioSystem...
- Tên hàm thể hiện chức năng : các tiền tố thường được sử dụng get/set, add/remove,
create/destroy, start/stop, insert/delete....
- Tên class dùng chữ hoa tất cả các chữ cái đầu mỗi từ, còn lại là các chữ cái thường.
Vd: GameBoard,...
8
C++ Coding Convention
Khoảng cách
- Nên đặt khoảng cách sau dấu phẩy hoặc dấu chấm phẩy.
- Xung quanh các toán tử.
VD:
Method(int a, int b)
x=a+b;
for(int i = 0; i < n; i++)
9
C++ Coding Convention
Dấu ngoặc
- Tuỳ theo các chuẩn quy định.
-
VD: chuẩn GNU:
if (a[i] > a[i + 1])
{
hoặc
if(a[i] > a[i + 1]) {
temp = a[i];
temp = a[i]; a[i] = a[i + 1];
a[i] = a[i + 1];
a[i + 1] = temp;
a[i + 1] = temp; }
}
10
C++ Coding Convention
Định dạng:
- Lùi đầu dòng các đoạn code, mỗi mức dùng 3 hoặc 4 ký tự, tốt nhất là
dùng tab.
- Mỗi dòng chỉ chứa nhiều nhất một lệnh và không dài quá 79 ký tự.
- Có thể căn thẳng hàng để nâng cao hightlight.
- Nên có các khoảng trắng giữa từ khoá và dấu ‘(‘, nhưng không nên có
khoảng trắng giữa tên hàm và dấu ‘(‘. Nên có một khoảng trắng trước và
sau mỗi toán tử số học hoặc logic, chẳng hạn +, <<, ||, <=,...
- Chèn các dòng trắng khác giữa các đoạn khác nhau trong chương trình
11
C++ Coding Convention
Thiết kế:
- Không để dữ liệu của lớp ở dạng public
- Hạn chế tối đa việc dùng biến toàn cục
- Nguyên tắc quyền ưu tien tối thiểu
- Không để dữ liệu trong lớp mà nó không thực sự thuộc về lớp đó.
- Các hàm hoặc phương thức của lớp không nên tạo output trừ khi đó
là nhiệm vụ của phương thức đó.
- Mỗi phương thức/hàm chỉ chứa tối đa 30 dòng kể cả tính từ mở hàm
tới kết thúc hàm.
12
C++ Coding Convention
CODE:
- Viết theo chuẩn OSI dù complier có bắt buộc hay không.
- Hạn chế #include ngoài chuẩn.
- Nên để int main() và return 0; thay vì void main()
- Khai báo using std:: ngay cả khi IDE không bắt buộc.
- Các hằng số không nên viết trực tiếp vào chương trình
13
C++ Coding Convention
- Luôn viết new và delete thành từng cặp.
- Khi khai báo con trỏ dấu con trỏ nên được đặt liền với tên nhắm tránh trường
hợp: char *p,q,r;//q,r không là con trỏ
- Nên sử dụng các dấu () khi muốn tránh các lỗi về độ ưu tiên toán tử
- Tách các biểu thức phức tạp thành các biểu thức đơn giản hơn
14
C++ Coding Convention
- Viết các lệnh dễ hiểu, không viết các lệnh “khôn ngoan”.
- Cẩn thận với dấu = và dấu == là 2 toán tử gây nhầm lẫn nhất trên C,
nhưng bạn có thể tránh gặp nó bằng thói quen viết r-value ( biểu thức bên
phải phép gán) sang bên trái phép so sánh.
- Các idiom
15
II. Các lỗi thường gặp trong C++
STT
Thông báo lỗi
Ý nghĩa
1
( expected
2
) expected
3
,expected
Thiếu dấu
Các lỗi này thường xảy ra khi ta sơ sót, dẫn đến nếu
thiếu các dấu mở hoặc đóng ngoặc, dấu phẩy
4
{ expected
5
} expected
6
286/287 instructions
not enabled
Tập lệnh của bộ vi xử lý 80286 và bộ xử lý toán học
chưa được kích hoạt
Vào Options/Compiler/Advanced Code generation ...
để điều chỉnh lại
7
Ambiguity between
‘function 1’ and
‘function 2’
2 hàm function 1 và function 2 giống nhau, không thể
phân biệt được
16
8
Array bounds missing ] Thiếu dấu đóng ngoặc ] khi truy xuất đến các
phần tử của mảng
9
Array must have at
least one element
Khi khai báo mảng phải có ít nhất 1 phần tử.
Xảy ra khi khai báo mảng mà số phần tử tối đa
là âm hoặc bằng 0
10
Array size too large
Kích thước của mảng quá lớn, vượt quá dung
lượng vùng nhớ quy ước là 64K
11
Bit field cannot be
static
Kiểu dữ liệu Bit field không thể có kiểu static
12
Bit field too large
Kích thước của Bit filed quá lớn
13
Bit field must be signed
Kiểu dữ liệu của Bit field phải là số nguyên
or unsigned int
Bit filed must contain Kích thước của mỗi Bit field phải có ít nhất 1bit
at least one bit
Body already defined
Hàm đã được định nghĩa rồi. Lỗi xảy ra khi ta
for this function
viết phần thân của một hàm nào đó 2 lần
Call of nonfunction
Câu lệnh gọi hàm của ta là sai. Tên hàm mà ta
gọi có thể là một tên kiểu/hằng/biến ...
14
15
16
17
1
Cannot call ‘main’ from
within the program
Không thể gọi thực hiện hàm main() trong chương
trình, vì đây là một hàm đặc biệt, tự động thực hiện
một lần trong mỗi lần chạy chương trình
18
Cannot cast from ‘type 1’
to ‘type 2’
Không thể ép kiểu dữ liệu từ kiểu 1 sang kiểu 2
19
Cannot convert ‘type 1’
to ‘type 2’
Không thể chuyển đổi dữ liệu từ kiểu 1 sang kiểu 2
20
Cannot initialize ‘type 1’
with ‘type 2’
Không thể khởi gán dữ liệu thuộc kiểu 2 cho biến
thuộc kiểu 1
21
Cannot modify a const
object
Không thể thay đổi giá trị của một hằng số. Xảy ra
khi ta thực hiện phép gán giá trị mới cho một hằng
22
Case outside of switch
Lệnh CASE nằm bên ngoài SWITCH
23
Case statement missing :
Lệnh CASE thiếu dấu 2 chấm (:)
24
Character constant must
be one or two characters
long
Kích thước của hằng ký tự không đúng. Xảy ra khi
ta ghi một chuỗi dài các ký tự vào giữa cặp dấu
nháy đơn ‘’
18
25
26
27
28
29
Compound statement
missing }
constant expression
required
Could not find a match
for argument(s)
Could not find file
‘filename’
Thiếu dấu } kết thúc khối lệnh
Vị trí này lẽ ra phải là một biểu thức hằng, có giá
trị không đổi
Không tìm thấy đối số thích hợp
Không tìm thấy tập tin
Declaration is not
allowed here
Declaration missing ;
Declaration syntax error
Declaration terminated
incorrectly
Vị trí khai báo sai. Không được khai báo tại đây
33
34
Declaration was expected
Default outside of switch
35
Default value missing
Thiếu khai báo
Lệnh mặc định DEFAULT nằm bên ngoài khối
lệnh SWITCH
Thiếu giá trị mặc
19định
30
31
32
Khai báo thiếu dấu chấm phẩy (;)
Khai báo không đúng cú pháp
Khai báo sai (gần giống lỗi trên)
36
Division by zero
Chia cho 0, lỗi này xảy ra khi mẫu số của một
phân số có giá trị bằng 0
37
Do statement must
have while
Lệnh Do phải đi với While. Xảy ra khi thiếu
While trong câu lệnh Do ...
38
Do – while statement
missing (
39
Do – while statement
missing )
40
Do – while statement
missing ;
41
Duplicate case
Lệnh CASE bị trùng, xảy ra khi ta viết 2 dòng
CASE khác nhau nhưng cùng một giá trị như
nhau
42
43
44
Expression expected
Expression syntax
Extra parameter in call
to function
Vị trí này phải là một biểu thức
Sai cú pháp khi xây dựng biểu thức
Gọi thực hiện hàm nhưng lại truyền dư tham số
45
File name too long
Tên tập tin quá dài
Thiếu dấu (, ), ; trong câu lệnh Do ... While
20
46
For statement missing (
47
For statement missing )
48
For statement missing ;
49
‘function’ cannot return Hàm có tên ‘function’ không thể trả về một giá trị,
a value
thông thường vì ta khai báo nó là hàm kiểu Void
‘function’ must be
Hàm có tên ‘function’ phải được khai báo không có
declared with no
tham số, xảy ra khi phần khai báo (prototype) và
parameters
phần thân hàm không giống nhau về số tham số
‘function’ must be
Tương tự như lỗi trên
declared with one
parameter
‘function’ must be
declared with two
parameters
Function call missing )
Gọi hiện thực hàm thiếu )
50
51
52
54
55
Function calls not
supported
Thiếu dấu (, ), ; trong câu lệnh For
Không thể gọi hàm dạng này/kiểu này
21
56
57
Function should return a Hàm cần phải trả về 1 giá trị, xảy ra khi ta khai báo
value
hàm có kiểu trả về nhưng lại thiếu câu lệnh
Return ...
Goto statement missing
Dùng lệnh Goto mà không có nhãn
label
58
‘identifier’ is not a
member of struct
Tên ‘identifier’ không phải là thành phần của cấu
trúc, xảy ra khi ta viết tên thành phần sai
59
‘identifier’ is not a
parameter
Tên ‘identifier’ không phải là 1 tham số
60
Identifier expected
Thiếu tên biến
61
If statement missing (
Câu lệnh If thiếu mở hay đóng ngoặc
62
If statement missing )
63
Illegal character
Ký tự không hợp lệ, thường xảy ra khi ta biểu diễn
‘character’ (0x‘value’) các hằng số hệ hexa, nhưng lại sử dụng các chữ cái
khác A..F hay a..f
64
Illegal octal digit
Không phải là một hệ 8 hợp lệ
65
Illegal pointer
subtraction
Thực hiện phép trừ không hợp lệ trên con trỏ
22
66
67
68
69
70
71
72
Illegal use of floating
point
Illegal use of pointer
Dùng dấu chấm động không đúng, ví dụ sử dụng
phép toán modulo % trên số thực chẳng hạn
Dùng con trỏ không hợp lệ
Implicit conversion of
‘type 1’ to ‘type 2’ not
allow
Không cho phép ngầm chuyển từ kiểu 1 sang kiểu 2
Improper use of typedef Kiểu dữ liệu ‘identifier’ được sử dụng không đúng
‘identifier’
Incompatible type
Không thể chuyển đổi kiểu dữ liệu
conversion
Incorrect number format Không phải là dữ liệu dạng số, thường xảy ra khi ta
gõ các ký tự khác 0..9 trong 1 dữ liệu kiểu số
Incorrect use of default
Dùng DEFAULT không đúng
73
Invalid use of dot
Dùng dấu chấm (.) không đúng vị trí
74
Lvalue required
75
main must have a return
type of int
Vế trái của phép gán phải là 1 tên biến. Lỗi xảy ra
khi ta gán giá trị cho 1 hằng
Hàm main phải trả về 1 giá trị kiểu int
23
76
Misplaced break
77
Misplaced continue
Dùng break ngoài vòng lặp hoặc ngoài
SWITCH
Dùng continue ngoài vòng lặp
78
Misplaced decimal point
Dấu chấm thập phân sai vị trí
79
Misplaced else
Dùng else sai vị trí (thiếu if,...)
80
81
‘new’ and ‘delete’ not
supported
No: following the ?
Không được phép dùng new và delete trong cấp
phát vùng nhớ động
Toán tử điều kiện thiếu dấu 2 chấm (:)
82
No file name ending
Không có phần kết thúc tên tập tin
83
No file name given
Không có tên tập tin
84
No type information
Không tìm thấy thông tin gì về kiểu dữ liệu
85
Not an allowed type
Kiểu dữ liệu này không cho phép dùng ở đây
86
Numeric constant too
large
Hằng số có giá trị quá lớn
24
87
Pointer to structure
required on left side of
-> or -> *
Xảy ra khi dùng con trỏ cấu trúc không đúng
cách để truy xuất các thành phần của cấu trúc
88
sizeof may not be
applied to a bit field
sizeof may not be
applied to a function
Size of ‘identifier’ is
unknown or zero
Size of the type is
unknown or zero
Statement missing ;
Toán tử sizeof() không dùng cho kiểu bit field
89
90
91
92
93
94
Toán tử sizeof() không dùng cho hàm
Kích thước của ‘identifier’ bằng 0 hoặc không
xác định
Kích thước của kiểu dữ liệu bằng 0 hoặc không
xác định
Thiếu dấu chấm phẩy (;), thông thường do thiếu
dấu ; tại dòng trên của dòng báo lỗi
Structure required on Xảy ra khi truy xuất các thành phần của cấu trúc
left side of . or . *
không đúng cách
Structure size too large Kích thước của cấu trúc quá lớn, vượt quá giới
hạn 64K chẳng hạn
25