Bộ tiền xử lý trong c tiếng anh là gì

Preprocessor [ bộ tiền giải quyết và xử lý ] là một khái niệm đặc trưng trong C / C + +, đó là một công cụ được thực thi trước khi quy trình biên dịch thực sự được thực thi .

Bộ tiền xử lý có nhiệm vụ xử lý các chỉ thị tiền xử lý, như #include, #define, #if, #ifdef, #ifndef, #endif,… Nó làm việc trên một file source C++ tại một thời điểm bằng cách thay thế các chỉ thị #include bằng nội dung của các file tương ứng [thường chỉ chứa khai báo], thay thế các macro #define và chọn các phần khác nhau trong source code để biên dịch tùy thuộc vào các chỉ thị #if, #ifdef, #ifndef.

Trong bài này mình sẽ tổng hợp 1 số  best practice về Preprocessor

Include Guards

Trong bài này mình sẽ tổng hợp 1 số best practice về Preprocessor

Một file source có thể include một hoặc nhiều file header. Và một file header có thể include một hoặc nhiều file header khác. Do đó một source file include nhiều file header thì có thể gián tiếp include một file header nào đó nhiều lần. Nếu một file header được include nhiều lần mà trong file đó có chứa định nghĩa struct, class, … thì khi biên dịch sẽ bị lỗi.

“include guards” thường được dùng để tránh lỗi này. Để áp dụng “include guards” thì chúng ta sẽ sử dụng các chỉ thị #define, #ifndef, #endif. Ví dụ →

1234567

/ / Foo. h

# ifndef FOO_H

# define FOO_H

classFoo{/ / a class definition

};

# endif / / FOO_H

“ include guards ” hoàn toàn có thể work ok với toàn bộ những standard compiler và preprocessor. Vấn đề mà những dev cần chú ý quan tâm ở đây là làm thế nào bảo vệ tính duy nhất của macro dùng để guard. Ví dụ trong trường hợp này, nếu có nhiều hơn 1 header file cùng sử dụng FOO_H làm macro để guard thì hoàn toàn có thể dẫn đến lỗi do include thiếu header. Và nếu trong project của tất cả chúng ta có sử dụng thư viện của bên thứ 3 nữa thì năng lực bị trùng sẽ càng cao .
Ngoài ra với cách này cũng cần phải bảo vệ macro sử dụng trong “ include guards ” cũng phải khác với toàn bộ những macro được define trong tổng thể header của khác .

Để tránh rắc rối khi sử dụng “include guards” bằng macro thì hầu hết các trình biên dịch C++ hiện nay đều support chỉ thị #pragma_once để đảm bảo một header chỉ được include một lần vào 1 file source. Ví dụ →

12345

/ / Foo. h

# pragma once

classFoo{

};

Tuy nhiên ae phải nhớ rằng cái này ko thuộc ISO C + + standard nên không bảo vệ toàn bộ những trình biên dịch đều tương hỗ nhé, và những compiler ko tương hỗ sẽ bí mật lặng lẽ bỏ lỡ thông tư này .
Bản thân mình thì vẫn quen dùng “ include guards ” bằng macro mặc dầu nhiều lúc cũng bị trùng với macro trong những 3 rd libraries .

Conditional pre-processing logic

“ Conditional pre-processing logic ” – “ tiền giải quyết và xử lý điều kiện kèm theo logic ” là việc làm cho những phần code nào đó trở nên available hoặc unavailable trong quy trình biên dịch bằng cách sử dụng những thông tư tiền giải quyết và xử lý điều kiện kèm theo .
Một số use-cases điển hình →

  • Cùng một app nhưng có các build mode khác nhau [debug, release, testing], mỗi mode lại có các phần code log thêm khác nhau hoặc log level cũng khác nhau
  • Cùng một source code nhưng sử dụng để build binary để run trên các platform khác nhau
  • Cùng một source code nhưng sử dụng để build binary cho các variant khác nhau của phần mềm. Ví dụ : dùng chung source code cho các bản Basic, Plus, và Premium của cùng 1 phần mềm chỉ khác nhau một chút về tính năng.

* Ví dụ 1: Sử dụng Conditional pre-processing trong cross-plaform source code [source code hỗ trợ nhiều platform]

uint32_tThreadUtil::getThreadId[]{

# if [ defined [ _WIN32 ] | | defined [ _WIN64 ] ]

std::stringstreamss;

ss

Chủ Đề