Cùng xem Giới thiệu về bộ tiền xử lý (preprocessor) | TopDev trên youtube.
diễn giải và tiền xử lý
Khi bạn biên dịch mã của mình, bạn mong đợi trình biên dịch sẽ biên dịch mã chính xác như bạn đã viết.
Trước khi biên dịch, tệp mã trải qua một giai đoạn được gọi là diễn giải . Rất nhiều điều xảy ra trong giai đoạn diễn giải này để chuẩn bị mã cho quá trình biên dịch. một tệp mã được thông dịch được gọi là trình thông dịch .
Đáng chú ý nhất trong số các giai đoạn trình thông dịch liên quan đến bộ tiền xử lý. bộ tiền xử lý được coi là một chương trình riêng biệt để thao tác các đoạn mã (văn bản mã) trong mỗi tệp mã.
Khi bộ tiền xử lý được thực thi, nó sẽ quét tệp mã (từ trên xuống dưới), tìm kiếm các lệnh tiền xử lý. chỉ thị tiền xử lý (thường được gọi là chỉ thị) là các câu lệnh bắt đầu bằng ký hiệu # và kết thúc bằng một dòng mới (không phải dấu chấm phẩy). các hướng dẫn này yêu cầu bộ tiền xử lý thực hiện các tác vụ với một văn bản mã cụ thể. lưu ý rằng bộ xử lý trước không hiểu cú pháp c ++.
Đầu ra của bộ tiền xử lý trải qua một số giai đoạn diễn giải và sau đó được biên dịch. Lưu ý rằng bộ xử lý trước không sửa đổi các tệp mã gốc theo bất kỳ cách nào; thay vào đó, tất cả các thay đổi mã do bộ tiền xử lý thực hiện tạm thời xảy ra trong bộ nhớ mỗi khi tệp mã đã biên dịch được thực thi.
Trong bài học này, chúng ta sẽ thảo luận về chức năng của một số chỉ thị tiền xử lý phổ biến nhất.
#includes
Bạn đã thấy lệnh #include đang hoạt động. khi bạn #include tệp, trước tiên bộ xử lý sẽ thay thế câu lệnh #include bằng nội dung của tệp mà bạn đưa vào. nội dung bao gồm sẽ được hiển thị trước (cùng với phần còn lại của các tệp mã của bạn) và sau đó được biên dịch.
Hãy xem xét chương trình sau:
khi bộ xử lý trước được thực thi trong chương trình này, bộ tiền xử lý sẽ thay thế #include bằng nội dung được xử lý trước của tệp có tên iostream.
vì #include hầu như chỉ được sử dụng để đưa tệp vào tiêu đề (tệp .h), chúng ta sẽ thảo luận chi tiết hơn về #include trong bài học tiếp theo (khi chúng ta thảo luận chi tiết hơn về tệp tiêu đề).
định nghĩa macro
Lệnh #define có thể được sử dụng để tạo macro. Trong c ++, macro là quy tắc xác định cách chuyển đổi một số văn bản mã đầu vào thành văn bản mã đầu ra mong muốn.
Có hai loại macro cơ bản: macro kiểu đối tượng và macro kiểu hàm.
Macro giống hàm hoạt động giống như hàm và có mục đích tương tự. Chúng ta sẽ không thảo luận về chúng ở đây vì việc sử dụng chúng thường được coi là nguy hiểm và hầu hết mọi thứ chúng có thể làm đều có thể thực hiện được với chức năng bình thường.
Các macro giống đối tượng có thể được xác định theo hai cách:
định nghĩa trên không có số nhận dạng thay thế, trong khi định nghĩa dưới thì có. vì đây là các lệnh tiền xử lý (không phải khai báo), lưu ý rằng không có dòng nào kết thúc bằng dấu chấm phẩy.
macro dưới dạng đối tượng có văn bản thay thế
Xem Thêm : NĐ-CP là gì?
Khi bộ tiền xử lý gặp lệnh này, bất kỳ lần xuất hiện bổ sung nào của mã định danh macro sẽ được thay thế bằng văn bản mà chúng tôi đã xác định trước đó. thông thường, tên của mã định danh macro sẽ được viết bằng chữ hoa, sử dụng dấu gạch dưới để thể hiện dấu cách.
Hãy xem xét chương trình sau:
bộ xử lý trước chuyển đổi những điều trên thành những điều sau:
mà khi được thực thi, sẽ in ra kết quả tên tôi là: alex
macro giống đối tượng không có văn bản thay thế
Các macro giống đối tượng cũng có thể được xác định mà không cần văn bản thay thế.
ví dụ:
xác định use_yen
Các macro cho biểu mẫu này hoạt động như sau: mọi lần xuất hiện tiếp theo của số nhận dạng macro này ( use_yen ) sẽ bị xóa và thay thế bằng không.
điều này có vẻ khá vô ích. tuy nhiên, đó không phải là những gì lệnh này thường được sử dụng. chúng ta sẽ thảo luận về việc sử dụng biểu mẫu này trong thời gian ngắn.
biên dịch mã có điều kiện
các chỉ thị tiền xử lý trình biên dịch có điều kiện sẽ cho phép bạn chỉ định một số điều kiện nhất định sẽ gây ra lỗi không thể biên dịch hoặc biên dịch không thành công. Có khá nhiều chỉ thị biên dịch có điều kiện khác nhau, nhưng ở đây chúng tôi sẽ giới thiệu ba chỉ thị được sử dụng nhiều nhất: #ifdef, #ifndef và #endif.
Chỉ thị tiền xử lý
#ifdef cho phép bộ tiền xử lý kiểm tra xem số nhận dạng đã được xác định trước # chưa. nếu nó đã được xác định, mã giữa #ifdef và #endif sẽ được biên dịch. nếu không, mã sẽ bị bỏ qua.
Hãy xem xét chương trình sau:
Vì print_joe là #define, dòng cout & lt; & lt; “Joe n” sẽ được biên dịch. vì print_bob chưa được #define, dòng cout & lt; & lt; “bob n” sẽ bị bỏ qua.
#ifndef ngược lại với #ifdef, vì nó cho phép bạn kiểm tra xem số nhận dạng chưa được xác định.
chương trình này in bob, vì print_bob chưa bao giờ được định nghĩa.
#if 0
Cách sử dụng phổ biến của biên dịch có điều kiện là sử dụng #if 0 để loại trừ một khối mã khỏi quá trình biên dịch (như thể nó nằm trong một khối nhận xét):
Xem Thêm : Techmaster Việt Nam – Học là có việc
Đoạn mã trên chỉ in joe vì bob và steve đã nằm trong khối #if 0 mà bộ xử lý trước sẽ loại trừ khỏi quá trình biên dịch.
Điều này cung cấp một cách thuận tiện để nhận xét mã chứa nhiều dòng.
macro giống đối tượng không ảnh hưởng đến các chỉ thị tiền xử lý khác
Bây giờ bạn có thể tự hỏi:
Vì chúng tôi định nghĩa print_joe là không có gì, tại sao bộ tiền xử lý không thay thế print_joe trong #ifdef print_joe bằng không?
Macro chỉ thay thế văn bản bằng mã bình thường. nhưng với các lệnh tiền xử lý có điều kiện này, chúng sẽ được xử lý theo cách khác. vì vậy print_joe trong #ifdef print_joe chỉ thay thế một số văn bản nhất định bằng mã bình thường, bạn có thể xem ví dụ sau để hiểu rõ hơn
ví dụ:
Trên thực tế, đầu ra của bộ tiền xử lý không chứa chỉ thị trình biên dịch nào cả; tất cả đều được xử lý và loại bỏ trước khi biên dịch.
phạm vi định nghĩa
địa chỉ sẽ được xử lý trước khi biên dịch, từ trên xuống dưới của mỗi tệp.
Hãy xem xét chương trình sau:
mặc dù có vẻ như #define my_name “alex” được định nghĩa bên trong hàm foo, bộ tiền xử lý đã được thông báo vì nó không hiểu các khái niệm c ++ như hàm. vì vậy chương trình này hoạt động tốt và không phụ thuộc vào vị trí định nghĩa của #define my_name “alex”, vì vậy chúng tôi có thể xác định nó trước hoặc ngay sau hàm foo, nhưng để dễ đọc, bạn thường muốn # xác định id bên ngoài các hàm .
khi bộ xử lý trước kết thúc, tất cả các số nhận dạng được xác định từ tệp đó sẽ bị xóa. điều này có nghĩa là các chỉ thị chỉ có giá trị từ thời điểm định nghĩa đến cuối tệp mà chúng được định nghĩa. các lệnh được xác định trong một tệp mã không ảnh hưởng đến các tệp mã khác trong cùng một dự án.
Hãy xem xét ví dụ sau:
function.cpp:
main.cpp:
chương trình trên sẽ in:
mặc dù print đã được xác định trong main.cpp, điều đó không ảnh hưởng đến mã trong tệp function.cpp (print chỉ là #define từ điểm xác định đến cuối main.cpp).
bài viết của cafedev
Nguồn: https://dongnaiart.edu.vn
Danh mục: FAQ
Lời kết: Trên đây là bài viết Giới thiệu về bộ tiền xử lý (preprocessor) | TopDev. Hy vọng với bài viết này bạn có thể giúp ích cho bạn trong cuộc sống, hãy cùng đọc và theo dõi những bài viết hay của chúng tôi hàng ngày trên website: Dongnaiart.edu.vn