Dự án chương trình

Một phần của tài liệu Bài giảng ngôn ngữ lập trình C (Trang 98 - 100)

/ *g ọi hàm g() biến b được cấp phát

1.Dự án chương trình

Trong các chương trình lớn việc viết tất cả mã chương trình trên cùng một tệp là điều khơng thể. Để phân chia cơng việc viết chương trình, mỗi người lập trình sẽ đảm nhiệm viết một số hàm và mỗi người sẽ viết trên một tệp chương trình khác nhau. Vì đây là một chương trình một hàm có thể gọi một hàm khác mà được viết trong một tệp khác. Vậy trong trường hợp này trình biên dịch sẽ phải làm thế nào để có thể hợp nhất nhiều têp mã nguồn khác nhau thành một chương trình duy nhất? Làm thế nào để khi chúng ta viết chương trình gọi một hàm được viết trong một tệp khác mà trình biên dịch khơng báo lỗi? Chúng ta xem xét vấn đề này qua một ví dụ về chương trình có hai tệp nguồn "func.c" và "main.c".

Tệp nguồn "func.c":

int func1(int, int) { ...} void func2(int) { ... } int func3() { ... } Tệp nguồn "main.c": void main() { func1(5, 6); func2(2); func3(); }

Trong ví dụ này hàm main() viết trong tệp "main.c" gọi đến các hàm viết trong tệp "func.c". Theo nguyên tắc một lời gọi hàm sẽ không bị báo lỗi nếu trước đó đã có khai báo nguyên mẫu

của hàm. Do vậy trong tệp "main.c" cần phải có khai báo nguyên mẫu của những hàm được gọi như sau.

Tệp nguồn "main.c" có khai báo nguyên mẫu hàm được gọi: int func1(int, int);

void func2(int); int func3(); void main() { func1(5, 6); func2(2); func3(); }

Tuy nhiên nếu viết như thế này thì người viết tệp main.c phải viết nguyên mẫu cho những hàm mà anh ta khơng phụ trách viết ra. Đáng lí ra thì chính người viết các hàm này sẽ phải viết nguyên mẫu cho chúng để những người sử dụng chỉ cần xem nguyên mẫu hàm của anh ta thế nào và gọi chúng mà thôi. Để làm được điều này người viết hàm của tệp func.c sẽ viết thêm một tệp tiêu đề mà chứa tất cả khai báo nguyên mẫu hàm mà anh ta viết như sau.

Tệp tiêu đề "func.h": int func1(int, int); void func2(int); int func3();

Bây giờ trong tệp "main.c" không cần tự viết khai báo nguyên mẫu hàm cần gọi nữa mà chỉ việc #include tệp tiêu đề "func.h". Khi đó các khai báo nguyên mẫu hàm trong "func.h" sẽ được ghép vào tệp "main.c". Tệp nguồn "main.c": #include "func.h" void main() { func1(5, 6); func2(2); func3(); }

Như vậy có thể thấy vai trò của các tệp tiêu đề như là nơi chứa "giao diện" của các hàm có thể gọi trong chương trình. Khi cần gọi đến hàm nào thì ta chỉ cần #include tệp tiêu đề mà chứa khai báo nguyên mẫu hàm đó. Các tệp tiêu đề chuẩn của hệ thống như <stdio.h>, <string.h>, ... cũng đóng vai trị này cho các hàm thư viện chuẩn của hệ thống.

Một chương trình viết với nhiều tệp nguồn được dịch trong hai pha. Pha thứ nhất là dịch riêng rẽ mỗi tệp nguồn để chuyển thành tệp mã máy. Pha thứ hai là thực hiện liên kết tất cả các tệp mã máy có từ pha dịch để tạo thành một tệp chạy duy nhất. Vai trò của pha liên kết là gắn kết các lời gọi hàm trong chương trình đến phần mã máy thực sự cho nó. Do vậy khi một chương trình có lời gọi một hàm mà hàm này khơng có khai báo thi hành thì sẽ bị báo lỗi tại pha này.

Pha liên k?t Pha d?ch main.c func.c main.o func.o prog.exe Thu vi?n hàm

Hình 11: Sơ đồ biên dịch cho ví dụ trên

Khi sử dụng một IDE để biên dịch một chương trình với nhiều tệp nguồn thì cần phải tạo dự án (project). Trong dự án ta khai báo tất cả các tệp nguồn có trong chương trình để giúp cho q trình biên dịch có thể thực hiện dịch và liên kết tự động các tệp cần thiết.

Một phần của tài liệu Bài giảng ngôn ngữ lập trình C (Trang 98 - 100)