Lập trình C/C++

Nguyên mẫu hàm trong C/C++ là gì? Và cách sử dụng

Nguyên mẫu hàm trong C/C++ là gì? Và cách sử dụng
Được viết bởi Minh Hoàng

Series lập trình C/C++, ngôn ngữ lập trình hệ thống mạnh mẽ.

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).

  1. Nguyên mẫu hàm là gì?
  2. Cách khai báo và vị trí đặt của nguyên mẫu hàm.
  3. 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:

  1. Hàm thực hiện chức năng được định nghĩa dưới hàm gọi nó.
  2. 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:

Cấu trúc các file của chương trình

Cấu trúc các file của chương trình

– 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;
}

Cảm ơn bạn đã theo dõi. Đừng ngần ngại hãy cùng thảo luận với chúng tôi!

Giới thiệu

Minh Hoàng

Xin chào, tôi là Hoàng Ngọc Minh, hiện đang làm BrSE, tại công ty Toyota, Nhật Bản. Những gì tôi viết trên blog này là những trải nghiệm thực tế tôi đã đúc rút ra được trong cuộc sống, quá trình học tập và làm việc. Các bài viết được biên tập một cách chi tiết, linh hoạt để giúp bạn đọc có thể tiếp cận một cách dễ dàng nhất. Hi vọng nó sẽ có ích hoặc mang lại một góc nhìn khác cho bạn[...]

1 bình luận

Translate »