Trong phần đầu tiên của loạt bài hướng dẫn lập trình C đang diễn ra, chúng tôi đã đề cập sơ qua về giai đoạn tiền xử lý. Trong hướng dẫn này, chúng tôi sẽ thảo luận chi tiết hơn một chút để bạn có ý tưởng cơ bản về nó trước khi tìm hiểu các khía cạnh lập trình C khác.
Tiền xử lý thường là giai đoạn đầu tiên của quá trình biên dịch chương trình, trong đó bất kỳ thứ gì bắt đầu bằng '#' đều được xử lý. Hãy lấy một đoạn mã ví dụ cơ bản.
Đúng vậy, đây là cùng một đoạn mã mà chúng ta đã sử dụng trong phần đầu tiên của loạt bài viết này. Ở đây, đây là dòng đầu tiên bắt đầu bằng dấu thăng '#'. Nói một cách dễ hiểu, dòng '#include <stdio.h>' đảm bảo nội dung của tệp tiêu đề 'stdio.h' được bao gồm trong chương trình này trong quá trình biên dịch.
Vậy thì điều gì xảy ra trong giai đoạn tiền xử lý là dòng này được thay thế bằng nội dung thực tế của tệp tiêu đề. Sau đây là cách mã trông như thế nào sau giai đoạn tiền xử lý:
Vì vậy, bạn có thể thấy, mọi thứ phía trên một vài dòng mã chúng tôi đã viết (xem phần cuối ảnh chụp màn hình) là nội dung của stdio.h. Bây giờ, tôi sẽ không đi sâu vào chi tiết về cách tôi quản lý để xem mã sau khi tiền xử lý, nhưng điều này là để cung cấp cho bạn một ý tưởng rõ ràng về những gì xảy ra trong quá trình tiền xử lý.
Tiếp theo, các dòng bao gồm tệp tiêu đề không phải là những dòng duy nhất bắt đầu bằng dấu thăng (#). Cũng có một thứ gọi là Macro cũng bắt đầu bằng #. Vì vậy, điều quan trọng là phải thảo luận về chúng ở đây (ít nhất là những điều cơ bản của chúng).
Macro không gì khác ngoài một cái tên (thường viết hoa) dùng để chỉ một đoạn mã. Macro được định nghĩa bằng lệnh chỉ thị '#define'. Sau đây là một ví dụ:
Vì vậy, chúng ta đã định nghĩa một macro PRINT_HELLO_WORLD với giá trị printf("\n Hello World \n"); . Bây giờ, bất cứ nơi nào chúng ta sử dụng tên macro này trong mã, nó sẽ được thay thế bằng giá trị của nó trong giai đoạn tiền xử lý. Sau đây là mã sau khi tiền xử lý:
Vì vậy, bạn thấy rằng cả hai lần xuất hiện của macro đều được thay thế bằng giá trị của nó ở giai đoạn tiền xử lý. Tất nhiên, có một số chi tiết khác liên quan đến macro mà bạn nên biết để sử dụng chúng thành công. Chúng tôi sẽ thảo luận về các chi tiết đó trong phần dành riêng cho Macro của loạt bài hướng dẫn này.
Tiếp theo, loại dòng thứ ba bắt đầu bằng # là #ifdef và #endif. Chúng được sử dụng để biên dịch có điều kiện. Để bạn có thể hình dung nhanh, có những lúc bạn không muốn một phần mã được biên dịch dựa trên một điều kiện nhất định, trong những trường hợp như thế này, các chỉ thị này được sử dụng.
Sau đây là một ví dụ:
Trong đoạn mã trên, vì 'CONDITION' không được định nghĩa ở bất kỳ đâu, nên lần xuất hiện đầu tiên của 'PRINT_HELLO_WORLD' sẽ bị bỏ qua khỏi đoạn mã chỉ ở giai đoạn tiền xử lý. Đây là bằng chứng:
Vì vậy, bạn chỉ có thể thấy một câu lệnh printf sau giai đoạn tiền xử lý.
Tiền xử lý thường là giai đoạn đầu tiên của quá trình biên dịch chương trình, trong đó bất kỳ thứ gì bắt đầu bằng '#' đều được xử lý. Hãy lấy một đoạn mã ví dụ cơ bản.
Mã:
#include
int main (void)
{
printf("\n Hello World \n");
return 0;
}
Vậy thì điều gì xảy ra trong giai đoạn tiền xử lý là dòng này được thay thế bằng nội dung thực tế của tệp tiêu đề. Sau đây là cách mã trông như thế nào sau giai đoạn tiền xử lý:
Vì vậy, bạn có thể thấy, mọi thứ phía trên một vài dòng mã chúng tôi đã viết (xem phần cuối ảnh chụp màn hình) là nội dung của stdio.h. Bây giờ, tôi sẽ không đi sâu vào chi tiết về cách tôi quản lý để xem mã sau khi tiền xử lý, nhưng điều này là để cung cấp cho bạn một ý tưởng rõ ràng về những gì xảy ra trong quá trình tiền xử lý.
Tiếp theo, các dòng bao gồm tệp tiêu đề không phải là những dòng duy nhất bắt đầu bằng dấu thăng (#). Cũng có một thứ gọi là Macro cũng bắt đầu bằng #. Vì vậy, điều quan trọng là phải thảo luận về chúng ở đây (ít nhất là những điều cơ bản của chúng).
Macro không gì khác ngoài một cái tên (thường viết hoa) dùng để chỉ một đoạn mã. Macro được định nghĩa bằng lệnh chỉ thị '#define'. Sau đây là một ví dụ:
Mã:
#include
#define PRINT_HELLO_WORLD printf("\n Hello World \n");
int main (void)
{
PRINT_HELLO_WORLD
PRINT_HELLO_WORLD
return 0;
}
Vì vậy, bạn thấy rằng cả hai lần xuất hiện của macro đều được thay thế bằng giá trị của nó ở giai đoạn tiền xử lý. Tất nhiên, có một số chi tiết khác liên quan đến macro mà bạn nên biết để sử dụng chúng thành công. Chúng tôi sẽ thảo luận về các chi tiết đó trong phần dành riêng cho Macro của loạt bài hướng dẫn này.
Tiếp theo, loại dòng thứ ba bắt đầu bằng # là #ifdef và #endif. Chúng được sử dụng để biên dịch có điều kiện. Để bạn có thể hình dung nhanh, có những lúc bạn không muốn một phần mã được biên dịch dựa trên một điều kiện nhất định, trong những trường hợp như thế này, các chỉ thị này được sử dụng.
Sau đây là một ví dụ:
Mã:
#include
#define PRINT_HELLO_WORLD printf("\n Hello World \n");
int main (void)
{
#ifdef CONDITION
PRINT_HELLO_WORLD
#endif
PRINT_HELLO_WORLD
return 0;
}
Vì vậy, bạn chỉ có thể thấy một câu lệnh printf sau giai đoạn tiền xử lý.