Ở bài viết trước, chúng ta đã biết được khái niệm Hàm là gì và và cách sử dụng hàm trong lập trình C/C++. Trong bài viết này sẽ trình bày một trong những tính năng quan trọng khác của C/C++ là Nguyên mẫu hàm (Function Prototype).
- Nguyên mẫu hàm là gì?
- Cách khai báo và vị trí đặt của nguyên mẫu hàm.
- Nguyên mẫu hàm được sử dụng khi nào?
1. Nguyên mẫu hàm là gì?
Nguyên mẫu hàm (Function Prototype) cung cấp cho trình biên dịch (compiler) tên của hàm, kiểu dữ liệu mà hàm trả về, số lượng các tham số của hàm (gồm kiểu dữ liệu và thứ tự của các tham số đó). Nhờ đó, hàm nguyên mẫu giúp cho trình biên dịch xác nhận các lời gọi hàm mà chưa cần định nghĩa hàm đó.
2. Cách khai báo và vị trí đặt của nguyên mẫu hàm.
■ 1.Cách khai báo:
// Trường hợp hàm không có tham số Kiểu_dữ_liệu_trả_về Tên_hàm(); // Trường hợp hàm có tham số Kiểu_dữ_liệu_trả_về Tên_hàm( Kiểu_dữ_liệu_1 tham_số_1, ..., Kiểu_dữ_liệu_n tham_số_n ); // Hoặc khai báo ngắn gọn, không cần ghi tên tham số Kiểu_dữ_liệu_trả_về Tên_hàm( Kiểu_dữ_liệu_1, ..., Kiểu_dữ_liệu_n );
Ví dụ:
・ TinhTong( int a, int b );
・ TinhHieu( int, int );
・ HoanVi( int &, int & );
・ RemoveExtension( char *, bool );
■ 2.Vị trí đặt của nguyên mẫu hàm:
Nguyên mẫu hàm khi khai báo cần phải được đặt trên/ đặt trước lời gọi hàm tức là trước hàm gọi nó thực hiện. (Xem ví dụ minh họa bên dưới)
3. Nguyên mẫu hàm được sử dụng khi nào?
・ Ở ví dụ của mục 4 trong bài viết Các bước viết một hàm trong C/C++, chúng ta thấy 2 hàm TinhTong va TinhHieu 2 số nguyên được đặt trên hàm main() (tức là hàm gọi) thì không cần khai báo nguyên mẫu hàm. Vì chương trình chạy từ trên xuống dưới thì trình biên dịch (compiler) đã nhận biết dc sự có mặt của 2 hàm này rồi, nên ở hàm main() có lời gọi hàm TinhTong, TinhHieu sẽ được thực hiện được bình thường.
・ Dùng nguyên mẫu hàm khi:
- Hàm thực hiện chức năng được định nghĩa dưới hàm gọi nó.
- Các hàm được tổ chức trong các file khác nhau.
■ 1.Khi hàm thực hiện chức năng (TinhTong, TinhHieu) được định nghĩa dưới hàm (main) gọi nó.
#include <stdio.h> // Khai báo nguyên mẫu hàm trước khi nó được gọi // Lưu ý: Có dấu ; khi kết thúc khai báo int TinhTong(int a, int b); int TinhHieu(int, int); int main() { // Khai báo biến int a, b, tong, hieu; // Nhập 2 số printf( "Nhap vao a = " ); scanf_s( "%d", &a ); printf( "Nhap vao b = " ); scanf_s( "%d", &b ); // Thực hiện lời gọi hàm tong = TinhTong(a, b); printf("Tong cua 2 so la: %d\n", tong); hieu = TinhHieu(a, b); printf("Hieu cua 2 so la: %d\n", hieu); getchar(); return 0; } // Định nghĩa hàm int TinhTong(int a, int b) { return a + b; } int TinhHieu(int a, int b) { return a - b; }
■ 2.Khi các hàm được tổ chức trong các file khác nhau, có nghĩa là mỗi hàm sẽ được viết trong từng file riêng biệt. Ví dụ các file trong chương trình được tổ chức như hình bên dưới:
– Trong đó:
- File NguyenMauHam.h : Khai báo các nguyên mẫu hàm
- File TinhTong.c : chứa định nghĩa của hàm tính tổng 2 số
- File TinhHieu.c : chứa định nghĩa của hàm tính hiệu 2 số
- File Main.c : hàm main() thực hiện chương trình
– Nội dung của các file như sau:
★ File NguyenMauHam.h
#ifndef NGUYEN_MAU_HAM #define NGUYEN_MAU_HAM // Nguyên mẫu hàm tính tổng 2 số int TinhTong(int a, int b); // Nguyên mẫu hàm tính hiệu 2 số int TinhHieu(int, int); #endif
★ File TinhTong.c
#include <stdio.h> // include file header khai báo nguyên mẫu hàm #include "NguyenMauHam.h" // Hàm tính tổng 2 số int TinhTong(int a, int b) { return a + b; }
★ File TinhHieu.c
#include <stdio.h> // include file header khai báo nguyên mẫu hàm #include "NguyenMauHam.h" // Hàm tính hiệu 2 số int TinhHieu(int a, int b) { return a - b; }
★ File Main.c
#include <stdio.h> // include file header khai báo nguyên mẫu hàm // trước khi 2 hàm TinhTong, TinhHieu được gọi bên trong hàm main() #include "NguyenMauHam.h" int main() { // Khai báo biến int a, b, tong, hieu; // Nhập 2 số printf( "Nhap vao a = " ); scanf_s( "%d", &a ); printf( "Nhap vao b = " ); scanf_s( "%d", &b ); // Thực hiện lời gọi hàm tong = TinhTong(a, b); printf("Tong cua 2 so la: %d\n", tong); hieu = TinhHieu(a, b); printf("Hieu cua 2 so la: %d\n", hieu); getchar(); return 0; }
Bài viết rất bổ ích ạ. Em cảm ơn