STDIO
Tìm kiếm gần đây
    • Nội dung
    • QR Code
    • 0
    • 0
    • Sao chép

    Preprocessor Và #include Directive

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

    Amy

    10/06/2015
    18/09/2020
    4 phút đọc
    Preprocessor Và #include Directive

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

    0 Bình luận
    Modern C++

    Modern C++

    STDIO Training - Đào Tạo Lập Trình C++.

    Đề xuất

    Conditional Compilation Directives Giải Quyết Xung Đột Include
    Hướng dẫn sử dụng conditional directive tránh include file nhiều lần.
    03/09/2015
    Compiler Warning C4996 và C Run-time Library hay _CRT_SECURE_NO_WARNINGS (CRT)
    Compiler warning C4996 là cảnh báo thường gặp khi sử dụng các hàm strcpy ...

    Khám phá

    Inline Functions Trong C++
    Tìm hiểu về về Inline function (hàm nội tuyến) trong ngôn ngữ lập trình ...
    10/06/2015
    Khởi Tạo Môi Trường Lập Trình Đồ Họa OpenGL Trên Windows với GLEW và GLFW3
    Hướng dẫn khởi tạo môi trường đồ họa với OpenGL, GLEW và GLFW3.
    28/09/2014
    Chỉ Thị Tiền Xử Lý trong C/C++
    Chỉ thị tiền xử lý là những chỉ thị cung cấp cho bộ tiền xử lý để xử lý ...
    10/08/2016
    Kỹ Thuật Grayscale và Nhị Phân Hoá Ảnh (Adaptive Threshold)
    Giới thiệu và chi tiết các thuật toán Grayscale, ảnh nhị phân và một số ...
    Thuật Ngữ Server và Thuật Ngữ Client
    Khái niệm Server và Client mở rộng không chỉ nhằm hiểu về Server và ...
    02/05/2014
    XSLT - Chuyển Đổi XML Thành HTML
    Giới thiệu Extensible Stylesheet Language - XSL, XSLT, cấu trúc tài liệu ...
    05/09/2015
    Phân Tích Dữ Liệu và Viết Rule cho Modsecurity
    Trích xuất và phân tích dữ liệu thông qua ModSecurity.
    Phân Biệt Tham Chiếu và Con Trỏ trong C++
    Phân biệt tham chiếu và con trỏ trong C++ theo phương pháp đơn giản.
    Khi bạn nhấn vào liên kết sản phẩm do STDIO đề xuất và mua hàng, STDIO có thể nhận được hoa hồng. Điều này hỗ trợ STDIO tạo thêm nhiều nội dung hữu ích. Tìm hiểu thêm.
    STDIO
    Trang chính
    Công ty TNHH STDIO

    30, Trịnh Đình Thảo, Hòa Thạnh, Tân Phú, Hồ Chí Minh
    +84 28.36205514 - +84 942.111912
    developer@stdio.vn

    383/1 Quang Trung, Phường 10, Quận Gò Vấp, Hồ Chí Minh
    Số giấy phép ĐKKD: 0311563559 do sở Kế hoạch và Đầu Tư TPHCM cấp ngày 23/02/2012

    ©STDIO, 2013 - 2020