Khai báo hàm bao gồm 2 phần: Khai báo prototype và viết nội dung của hàm đó.
Khai báo prototype là khai báo thông tin của một hàm, kiểu dữ liệu trả về, tham số truyền vào như thế nào, và không viết nội dung của nó. Vậy khai báo prototype để làm gì. Trình biên dịch cần phải biết những thông tin đó trước khi sử dụng nó, nghĩa là nếu sử dụng 1 hàm phải viết hàm đó trước, và đặt phía trên dòng gọi hàm đó, như vậy, khi chương trình phức tạp hơn, sẽ không thể xắp xếp được hàm nào trước hàm nào sau, nhưng nếu khai báo prototype trước thì dễ dàng hơn.Ví dụ, nếu muốn gọi hàm inc() trong hàm main(), thì phải khai báo trước hàm inc()
01 | char Var = 0; |
02 | void inc( void ) |
03 | { |
04 | Var = Var+1; |
05 | } |
06 | void main( void ) |
07 | { |
| inc(); |
09 | // i = 1; |
10 | while (1); |
11 | } |
như vậy, nếu muốn viết thêm một hàm khác như hàm dec(), thì lại phải viết trên hàm main()
01 | char Var = 0; |
02 | void inc( void ) |
03 | { |
04 | Var = Var+1; |
05 | } |
06 | void dec( void ) |
07 | { |
08 | Var = Var-1; |
09 | } |
10 | void main( void ) |
11 | { |
12 | inc(); |
13 | dec(); |
14 | // i = 0; |
15 | while (1); |
16 | } |
Vậy nếu muốn sử dụng hàm dec() trong hàm inc() thì sao
01 | char Var = 0; |
02 | void inc( void ) |
03 | { |
04 | Var = Var+1; |
05 | dec(); //lỗi ngay đây, vì dec() khai báo sau inc() |
06 | } |
07 | void dec( void ) |
08 | { |
09 | Var = Var-1; |
10 | } |
11 | void main( void ) |
12 | { |
13 | inc(); |
14 | dec(); |
15 | // i = 0; |
16 | while (1); |
17 | } |
vậy phải chuyển hàm dec() lên trên hàm inc() à, được, nhưng với 2 hàm thì có thể đơn giản, còn với hàng chục, hàng trăm hàm thì sao.
Bởi vậy, nếu như khai báo prototype thì dễ dàng hơn
01 | void inc( void ); //thông báo cho trình biên dịch biết tồn tại hàm này, định nghĩa thế này |
02 | void dec( void ); //kết thúc bằng dấu ";" và không viết nội dung ở đây |
03 |
04 | char Var = 0; |
05 |
06 | void main( void ) |
07 | { |
08 | inc(); |
09 | dec(); |
10 | // i = 0; |
11 | while (1); |
12 | } |
13 | /* |
14 | Nội dung của 2 hàm đã khai báo prototype trên có thể viết ở đây, hoặc ở một file .c được add vào project |
15 | Lưu ý là khai báo prototype ra làm sao, thì ở đây viết lại phải giống như vậy |
16 | */ |
17 | void inc( void ) |
18 | { |
19 | Var = Var+1; |
20 | dec(); // |
21 | } |
22 | void dec( void ) |
23 | { |
24 | Var = Var-1; |
25 | } |
Khai báo hàm như thế nào:
1 | /* |
2 | + returntype: Kiểu dữ liệu trả về khi thực thi hàm này, nếu không trả về thì return-type đặt là void |
3 | + function_name: là tên hàm, theo qui tắt đặt tên chỉ bao gồm chữ cái, chữ số và dấu gạch dưới "_", chú ý, chữ số không đặt đầu tiên |
4 | + arg_type: Kiểu dữ liệu của tham số đưa vào |
5 | + arg1, argN .. là tên tham số truyền vào |
6 | */ |
7 | returntype function_name ( arg_type arg1, ..., arg_type argN ); |
Ví dụ, khai báo và sử dụng hàm, như sau:
01 | /* |
02 | + Hàm tên add, thực hiện một phép cộng hai số, và trả về kết quả |
03 | + kiểu dữ liệu trả về: char |
04 | + Tham số truyền vào, a: kiểu dữ liệu char và b: kiểu dữ liệu char |
05 | */ |
06 | char add( char a, char b); |
07 |
08 | void main() |
09 | { |
10 | char c; |
11 | c = add(2,3); //Gọi hàm add, kết quả trả về gán trong c |
12 | //c = 5 |
13 | while (1); |
14 | } |
15 |
16 | char add( char a, char b) |
17 | { |
18 | char RetVal; |
19 | RetVal = a+b; |
20 | return RetVal; //Thực hiện xong phép tính, trả về kết quả thực hiện |
21 | } |
Chú ý về viết nội dung của hàm, nên đặt dấu móc mở “{” và dấu móc đóng “}” gióng thằng hàng và giống với chữ cái đầu tiên, như code sẽ dễ nhiền hơn.
Đăng nhận xét