Giả sử tôi có một tệp nguồn với nhiều chỉ thị tiền xử lý. Có thể xem nó trông như thế nào sau khi bộ tiền xử lý được thực hiện với nó?
Giả sử tôi có một tệp nguồn với nhiều chỉ thị tiền xử lý. Có thể xem nó trông như thế nào sau khi bộ tiền xử lý được thực hiện với nó?
Câu trả lời:
cl.exe
, giao diện dòng lệnh cho Microsoft Visual C ++, có ba tùy chọn khác nhau để xuất tệp được xử lý trước (do đó không thống nhất trong các phản hồi trước đó về Visual C ++):
/E
: tiền xử lý đến thiết bị xuất chuẩn (tương tự tùy chọn -E của GCC)/P
: tiền xử lý để tập tin/EP
: tiền xử lý đến thiết bị xuất chuẩn mà không có chỉ thị #lineNếu bạn muốn tiền xử lý một tệp không có chỉ thị #line, hãy kết hợp các tùy chọn /P
và /EP
.
/P
sẽ ngăn chặn việc tạo các tệp obj. Vì vậy, nếu bạn đặt /P
tùy chọn, bạn có thể nhận được lỗi liên kết nói rằng một số tệp obj có thể được tìm thấy vì thực sự nó không được tạo.
VS Developer command prompt
và KHÔNG tham gia Command prompt
khi cố gắng sử dụng trình biên dịch MS ( cl
). Trình biên dịch không có sẵn trong dấu nhắc comand thông thường.
Hầu hết các trình biên dịch có một tùy chọn để chỉ chạy bộ tiền xử lý. ví dụ: gcc cung cấp -E:
-E Stop after the preprocessing stage; do not run the compiler proper.
The output is in the form of preprocessed source code, which is sent
to the standard output.
Vì vậy, bạn chỉ có thể chạy:
gcc -E foo.c
Nếu bạn không thể tìm thấy một tùy chọn như vậy, bạn cũng có thể tìm thấy bộ tiền xử lý C trên máy của mình. Nó thường được gọi là cpp và có lẽ đã có trong đường dẫn của bạn. Gọi nó như thế này:
cpp foo.c
Nếu có các tiêu đề bạn cần đưa vào từ các thư mục khác, bạn có thể chuyển -I / path / to / include / dir cho một trong hai tiêu đề này, giống như bạn làm với một trình biên dịch thông thường.
Đối với Windows, tôi sẽ để nó cho các áp phích khác để cung cấp câu trả lời vì tôi không phải là chuyên gia ở đó.
Nhấp chuột phải vào tệp trên Solution Explorer, goto Properties. Trong Thuộc tính cấu hình-> C / C ++ -> Bộ xử lý trước, "Tạo tệp được xử lý trước" là những gì bạn đang tìm kiếm. Sau đó nhấp chuột phải vào tệp trong Solution Explorer và chọn "Biên dịch". Tệp được xử lý trước được tạo trong thư mục đầu ra (ví dụ: Phát hành, Gỡ lỗi) với phần mở rộng .i (nhờ Steed cho nhận xét của anh ấy).
Release
, Debug
) với một phần mở rộng .i
.
Thông thường bạn cần thực hiện một số xử lý hậu kỳ trên đầu ra của bộ tiền xử lý, nếu không, tất cả các macro chỉ mở rộng thành một lớp lót, rất khó đọc và gỡ lỗi. Đối với mã C, một cái gì đó như sau sẽ đủ:
gcc -E code.c | sed '/^\#/d' | indent -st -i2 > code-x.c
Đối với mã C ++, nó thực sự khó hơn rất nhiều. Đối với GCC / g ++, tôi thấy tập lệnh Perl này hữu ích.
Tôi không biết gì về trình biên dịch Microsoft, nhưng trên GCC, bạn có thể sử dụng điều này:
gcc -E -P -o result.c my_file.h
Nếu bạn muốn xem bình luận, hãy sử dụng:
gcc -E -C -P -o result.c my_file.h
Nhiều lựa chọn hơn có sẵn trên trang này .
Trong Visual Studio, bạn có thể biên dịch một tệp (hoặc dự án) với / P.
Như bk1e và Andreas M. đã trả lời, tùy chọn / P cho trình biên dịch sẽ khiến nó xử lý trước một tệp. Tuy nhiên, trong dự án của tôi sử dụng VS2005 và Platform Builder (đối với bộ xử lý ARM nhúng), dự án không đưa ra một tùy chọn trong hộp thoại (như được mô tả bởi Jim B) để kích hoạt tùy chọn đó.
Tôi có thể chạy CL thủ công và thêm / P, nhưng không thành công vì tôi không biết tất cả các tùy chọn dòng lệnh thích hợp được vô hiệu hóa bởi Platform Builder trong quá trình xây dựng đầy đủ. Vì vậy, tôi cần phải biết tất cả các tùy chọn đó.
Giải pháp của tôi là tìm trong tệp build.log và tìm dòng thực thi
CL blah-blah-blah myfile.c
Tôi đã sao chép dòng này vào clipboard. Phần "blah-blah-blah" chứa các tùy chọn xây dựng và rất lớn.
Quay trở lại IDE, tôi nhấp chuột phải vào myfile.c, chọn "Open Build Window", và sau đó trong cửa sổ đó tôi dán dòng lệnh xây dựng và thêm "/ P".
CL /P blah-blah-blah myfile.c
Làm xong. Tệp myfile.i được tạo ra, chứa đầu ra tiền xử lý.
CPIP là một bộ tiền xử lý C / C ++ mới được viết bằng Python. Nếu bạn muốn một bản trình bày trực quan chi tiết của một tệp được xử lý trước, hãy cho nó một shot.
CPIP là bộ xử lý trước C / C ++ được triển khai bằng Python. Hầu hết các bộ xử lý trước coi việc xử lý trước là một công việc bẩn thỉu phải được thực hiện càng sớm càng tốt. Điều này có thể làm cho rất khó để theo dõi các khiếm khuyết tinh tế ở giai đoạn tiền xử lý vì các bộ xử lý trước sẽ loại bỏ rất nhiều thông tin hữu ích để có được kết quả càng rẻ càng tốt.
Rất ít nhà phát triển thực sự hiểu về tiền xử lý, với nhiều người đó là một chút ma thuật đen tối. CPIP nhằm cải thiện điều đó và bằng cách ghi lại mọi chi tiết của quá trình tiền xử lý để CPIP có thể tạo ra một số thông tin trực quan tuyệt vời về sự phụ thuộc tệp, sử dụng macro, v.v.
CPIP không được thiết kế để thay thế cho cpp (hoặc bất kỳ bộ xử lý trước được thiết lập nào khác), thay vào đó CPIP coi sự rõ ràng và hiểu biết quan trọng hơn tốc độ xử lý.