2009-10-25 33 views

Trả lời

18

Lý do tương tự macro #define không - chúng dành cho bộ tiền xử lý, mở rộng những thứ như bao gồm và xác định trước khi trình biên dịch phù hợp.

+4

Định nghĩa ít hơn - bộ xử lý trước chạy TRƯỚC KHI trình biên dịch sẽ chạy và thay thế văn bản. Câu lệnh #include được thay thế bằng nội dung của tệp được tham chiếu. Một #define được nhập vào một bảng tra cứu, và sau đó khi định nghĩa được nhìn thấy trong mã, nó được thay thế bằng giá trị được lưu trữ, v.v ... Bạn có thể sử dụng một bộ xử lý trước thay vì tiêu chuẩn, nhưng ít mọi người làm như vậy trong thế giới thực. –

+0

không phải là nó cũng là tiền xử lý mà các dòng funky tiếp tục những thứ như \ và ghép nối các chuỗi ký tự bị hỏng? – JustJeff

+0

@JustJeff: xem http://stackoverflow.com/questions/1476892/poster-with-the-8-phases-of-translation-in-the-c-language; ghép chuỗi chuỗi được thực hiện trong giai đoạn dịch 6 giữa tiền xử lý (giai đoạn 4) và phân tích ngữ nghĩa/biên dịch (giai đoạn 7), vì vậy bạn có thể tự do thực hiện nó trong bộ tiền xử lý hoặc trình biên dịch; các đường nối dọc theo dấu gạch chéo ngược sẽ diễn ra trong giai đoạn 2 trước khi trình xử lý trước thích hợp để hoạt động – Christoph

10

dòng bắt đầu bằng # không phải là một phần của ngôn ngữ C, chúng là hướng dẫn cho bộ xử lý trước. Khi nó được thiết kế lần đầu, các dấu chấm phẩy không cần thiết.

4

#include là lệnh xử lý trước như #define. #include yêu cầu trình biên dịch bao gồm tệp được chỉ định trong mã nguồn của bạn trước khi mã của bạn thực sự được biên dịch.

+1

Tôi đã sửa định dạng cho bạn; khi bạn đang nhập câu trả lời, bạn có thể xem bản xem trước bên dưới hộp văn bản để xem nó sẽ trông như thế nào. # là một định dạng char, vì vậy bạn cần phải bảo vệ nó theo cách này hay cách khác. –

+0

cảm ơn sự giúp đỡ của bạn. – sdp07

7

"... trong khi các câu lệnh khác thực hiện".

Thứ nhất, Preprocessor chỉ không báo cáo. Tuyên bố là một thực thể chỉ tồn tại ở cấp độ ngữ nghĩa/ngữ nghĩa. Các chỉ thị tiền xử lý được xử lý ở các giai đoạn dịch tương đối sớm, trước khi bất kỳ phân tích cú pháp nào bắt đầu, do đó, ở giai đoạn đó không có điều gì như "tuyên bố" được nêu ra. Và, vì lý do này, không có lý do có ý nghĩa để yêu cầu kết thúc chỉ thị #include với dấu chấm phẩy. Nếu thực tế, các chỉ thị tiền xử lý theo định nghĩa chiếm toàn bộ dòng, nghĩa là chúng đã bị kết thúc bởi một ký tự dòng mới. Bất kỳ terminator bổ sung nào cũng sẽ thừa.

Thứ hai, không phải tất cả "các câu lệnh khác" đều kết thúc bằng dấu chấm phẩy. Ví dụ: một tuyên bố phức hợp không phải là

i = 5; 

{ /* <- compound statement begins here... */ 
    i = 10; 
} /* <- ... and ends here. Note: no semicolon */ 

i = 15; 
Các vấn đề liên quan