Search…

Preprocessor Và #include Directive

18/09/20204 min read
Tìm hiểu về chỉ thị tiền xử lí (preprocessor) và #include Directive trong C++.

Preprocessor là gì?

Bất cứ một file C++ hoặc C nào khi được biên dịch cũng sẽ trải qua các bước sau:

Chỉ thị tiền xử lí (preprocessor) là những chỉ thị cung cấp hướng dẫn trình biên dịch xử lí trước các thông tin trước khi bước vào giai đoạn biên dịch thực tế. Các quá trình hướng dẫn đặc biệt này có thể được viết trong một chương trình C/C++. Những hướng dẫn này có thể bao gồm một thư viện hay một số hướng dẫn đặc biệt để trình biên dịch hiểu về một số điều kiện nhất định được sử dụng trong chương trình.

Preprocessor được nhận biết là những dòng code bắt đầu với một kí tự #. Trước nó có thể tồn tại các khoảng trắng và preprocessor chỉ kéo dài trên một dòng code. Ngay sau khi một kí tự xuống dòng được phát hiện, các preprocessor kết thúc. Các preprocessor không phải là lệnh của ngôn ngữ C/C++ nên không kết thúc bằng dấu chấm phẩy.

Các preprocessor khác nhau sẽ thực hiện các nhiệm vụ khác nhau. Có thể phân loại preprocessor như sau:

  • Inclusion directives
  • Macro Definition Directives
  • Conditional Compilation Directives

Trong bài này chỉ đề cập đến Inclusion Directives.

#include directive là gì?

Một trong những ứng dụng phổ biến nhất của preprocessor đó là inclusion directive. Thể loại này chỉ có một chỉ thị, đó là #include. Trước khi vào giai đoạn Compile, chỉ thị #include sẽ chỉ thị cho bộ tiền xử lí tìm kiếm tập tin theo tên được ghi trong lệnh #include. Nếu tìm thấy, bộ tiền xử lí sẽ nhận nội dung của tập tin đó và đặt chèn vào tập tin nguồn đang xét ngay đúng vị trí của #include xuất hiện. Ngược lại, nếu không tìm thấy tập tin, chương trình sẽ thông báo lỗi: 

Error C1083: Cannot open include file

Có một ví dụ về #include:

stdio_thuy_library.h

int add(int a, int b)
{
	return a + b;
}

stdio_thuy_library_implement.cpp

#include "stdio_thuy_library.h"

#include <iostream>
using namespace std;

int main()
{
	cout << add(5, 10);
	return 0;
}

Như ví dụ trên thấy có 2 cách sử dụng #include đó là:

  • #include <filename>
  • #include "filename"

Khi #include được viết với dấu ngoặc nhọn có nghĩa đã cung cấp hướng dẫn cho bộ tiền xử lí tìm kiếm tập tin theo một đường dẫn được xác định trong các thư mục include được trình biên dịch thiết lập, chẳng hạn như các thư viện chuẩn của C++( iostream, string…). Còn khi #include được viết với dấu ngoặc kép, con đường tìm kiếm của bộ tiền xử lí được mở rộng, bao gồm cả các thư mục hiện hành. Trình biên dịch C/C++ và môi trường lập trình đều có một cơ sở cho phép lập trình viên xác định nơi bao gồm các tập tin có thể được tìm thấy. Trong trường hợp tập tin không được tìm thấy ở các thư mục hiện hành, các thư mục include của trình biên dịch sẽ được kiểm tra, có thể xem như dấu ngoặc kép được thay thế bởi các dấu ngoặc nhọn <...>.

Ưu điểm

Include directive cho phép các thư viện code được phát triển nhằm:

  • Đảm bảo rằng tất cả mọi người sử dụng cùng một phiên bản của một định nghĩa bố trí dữ liệu hoặc mã thủ tục trong suốt một chương trình.
  • Dễ dàng tham chiếu chéo những thành phần được sử dụng trong một hệ thống.
  • Dễ dàng thay đổi chương trình khi cần thiết (chỉ cần một bản sao thay đổi).
  • Tiết kiệm thời gian.

Nhược điểm

Bên cạnh những ưu điểm trên, include directive vẫn tồn tại nhược điểm. Đó là có thể xảy ra tình trạng khai báo lại những đối tượng đã được khai báo. Chẳng hạn như, 2 file stdio_a.hstdio_b.h đều chứa:

#include "stdio_c.h"

Vậy nếu 1 file khác include 2 file trên:

  • #include "stdio_a.h"
  • #include "stdio_b.h"

Thì trong file đó sẽ có 2 phần nội dung trùng lắp từ file stdio_c.h và có thể gây ra lỗi biên dịch (một class được định nghĩa 2 lần).

IO Stream

IO Stream Co., Ltd

30 Trinh Dinh Thao, Hoa Thanh ward, Tan Phu district, Ho Chi Minh city, Vietnam
+84 28 22 00 11 12
developer@iostream.co

383/1 Quang Trung, ward 10, Go Vap district, Ho Chi Minh city
Business license number: 0311563559 issued by the Department of Planning and Investment of Ho Chi Minh City on February 23, 2012

©IO Stream, 2013 - 2024