Title Image

Blog Logo

C Preprocessor - Chỉ thị tiền xử lý

🌱 C Preprocessor - Chỉ thị tiền xử lý

    Cùng xem lại một chút về quá trình tiền xử lý trong C - Build Process
    ➤ Quá trình Preprocessor - tiền xử lý là quá trình chuẩn bị  cho quá trình Compile, ở giai đoạn này các file source code (.c, .cpp) sẽ được gộp với các file header (.h) để tạo thành các Extended Files (.i). Mặt khác trong quá trình này, các chỉ thị tiền xử lý như #define, #ifdef, ... sẽ được xử lý để thay thế.
    Vậy các chỉ thị tiền xử lý này gồm những gì? 

    👉 #include 

    Đầu tiên chính là chỉ thị #include rất quen thuộc, nó dùng để thêm các thư viện, các chỉ thị này được xử lý bằng cách thêm nội dung các file header (.h) vào nội dung các file (.c, .cpp).

    👉 #define (Macro Constant)

    Là những định nghĩ cái tên thay thế, giống như ví dụ sau đây:


    Cái tên PI sẽ được sử dụng thay thế cho số 3.1416 trong hình, #define những số như vậy mình gọi là các Macro Constant (Tham khảo 1 số tài liệu nước ngoài).
    Nếu trong chương trình cần gọi nhiều lần số pi, thì tất nhiên việc dùng cái tên thay thế là PI sẽ giúp ích nhiều cho việc ghi nhớ và việc sửa đổi sau này. Chẳng hạn cần sửa PI thành 3.14 thay vì 3.1416 thì người lập trình chỉ cần thay đổi 1 lần duy nhất ở #define. 

    👉 #define (Function Like-Macro)

    Cũng sử dụng từ khóa #define giống như trường hợp ở trên, nhưng trường hợp này ta sử dụng từ khóa có thể truyền vào những tham số, tức là có dạng giống với các hàm - Functions.
    Ví dụ hàm tính diện tích hình tròn như bên dưới:


    Người dùng có thể truyền vào tham số r - bán kính hình tròn để tính diện tích hình tròn. 
    Vậy nó khác gì Function không? Tại sao không dùng Function?
    Điểm khác biệt nằm ở chỗ Function Like-Macro được thay thế trong quá trình Preprocessor, tức là khi mà chưa Compile, thì chỗ nào có circleArea(r) sẽ được thay thế tương ứng trong chương trình của chúng ta rồi, không giống như Function được gọi khi run.
    Vì vậy Function Like-Macro có một số ưu điểm lớn nhất so với Function đó là tốc độ. Nó được thay thế trong quá trình Preprocessor nên không cần lời gọi hàm giống như Funtion. Vì vậy, khi dùng Function Like-Macro, tốc độ chương trình sẽ nhanh hơn so với Function.
    Tuy nhiên, sử dụng Function Like-Macro cũng có một số nhước điểm. 
  •  Đầu tiên, đó là việc replace code như nói trên, điều này dẫn đến nếu Function Like-Macro được sử dụng quá nhiều sẽ dẫn đến code size của chương trình tăng lên, gây tốn bộ nhớ.
  • Tiếp theo là việc Function Like-Macro chỉ là việc copy paste nên các parameters không có kiểu dữ liệu như Function. Việc sử dụng những biến đếm trong trường hợp này là không khả thi. 
  • Được sử dụng trong quá trình Preprocessor nên các tham số của Function Like-Macro sẽ không được kiểm tra lỗi trong quá trình Compile.
    Vì vậy, hãy cân nhắc trước khi sử dụng Function Like-Macro nha 😊

    👉 Conditional Compilation

    Cái này gần giống như Conditional Statement if - else, dùng để kiểm tra xem đoạn code nào có được chạy trong chương trình hay không. Lợi ích mà chỉ thị tiền xử lý này mang lại:
  • Chọn các đoạn code khác nhau phù hợp với chip, hệ điều hành, ...
  • Biên dịch cùng một source file trong các chương trình khác nhau (Giống như các thư viện vi điều khiển có thể sử dụng cho nhiều chip khác nhau).
    Sử dụng Conditional Compilation, ta có các chỉ thị: #if, #ifdef, #ifndef, #defined, #else, #elseif, ...
Các từ khóa này sử dụng đúng như ý nghĩa tên của chúng, chẳn hạn #if (expression) ...  #else ... dùng để kiểm tra expression, nếu nó đúng, thì ta sẽ thêm đoạn code trong phần if vào chương trình để Compile, lúc này đoạn code trong #else sẽ bị xóa đi. Còn nếu không đúng, ta sẽ thêm đoạn code trong #else vào chương trình. 
    Ví dụ sử dụng:

    
    Một ví dụ kinh điển khác - include guard: sử dụng để tránh việc re-include các thư viện. Cấu trúc này thường được sử dụng cho các file header, để tránh việc include nhiều lần một file header gây ra cảnh báo lỗi. include guard ở đây mang ý nghĩa nếu đã include file main.h rồi thì không cần include vào nữa.



>>>= Follow ngay =<<<

💚 Kênh Youtube Lập trình - Điện tử 💚

Để nhận được những bài học miễn phí mới nhất nhé 😊

Chúc các bạn học tập tốt 😊

Đăng nhận xét

0 Nhận xét