Làm cách nào để xem tệp nguồn C / C ++ sau khi tiền xử lý trong Visual Studio?


206

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ó?


Nó sẽ giúp ích nếu bạn cung cấp thêm thông tin như trình biên dịch nào bạn đang sử dụng.
JaredPar

Tôi hiện đang sử dụng Visual Studio 2005 làm IDE của mình.
Geo

Sau đó, theo mặc định, bạn đang sử dụng trình biên dịch cl.exe.
Martin York

3
Tại sao một câu trả lời gcc được chấp nhận khi anh ta nói rằng anh ta đang sử dụng VS2005?
Jim Buck

Câu trả lời:


147

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 ++):

Nế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/EP.


1
Làm thế nào để tôi chuyển các lệnh này cho một dự án với nmake và Makefile?
WooDzu

@WooDzu Sử dụng NMAKE (nmake.exe) để tự động hóa các tác vụ xây dựng các dự án Visual C ++ bằng cách sử dụng tệp tạo tệp truyền thống. ~ msdn.microsoft.com/en-us/l
Library / f35ctcxw.aspx

8
Xin lưu ý rằng /Psẽ ngăn chặn việc tạo các tệp obj. Vì vậy, nếu bạn đặt /Ptù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.
smwikipedia

Hãy chắc chắn rằng bạn đang ở VS Developer command promptvà KHÔNG tham gia Command promptkhi 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.
dmytro.poliarush

Cộng đồng VS2019: Lỗi / P LNK 1104 vẫn còn nóng trên báo chí.
Laurie Stearn

119

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 ở đó.



100

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).


9
"Tiền xử lý tệp" trong VS2010.
Rob W

18
BTW, các tập tin được tạo ra trong thư mục đầu ra (ví dụ Release, Debug) với một phần mở rộng .i.
Steed

1
Điều này giúp ích rất nhiều vì nó sử dụng cấu hình xây dựng đã được thiết lập trong dự án để tìm tất cả các tiêu đề phù hợp.
IanH

Lưu ý, đối với tôi trên MSVC 2015, tệp .i không có trong Thư mục đầu ra , mà trong Thư mục trung gian của dự án . Chúng không giống nhau nếu bạn tạo các dự án của mình bằng CMake.
dùng1556435

19

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.


8

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 .


1
Điều này cũng hoạt động với các trình biên dịch có nguồn gốc gcc, chẳng hạn như qcc.exe - cảm ơn!
hiền nhân

8

Hãy thử cl /EPnếu bạn đang sử dụng trình biên dịch C ++ của Microsoft.



5

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ý.


2

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ý.


2

Trên HĐH Windows, một câu trả lời đơn giản cho câu hỏi này là sử dụng lệnh dưới đây trong lời nhắc của DOS để xem tệp được xử lý trước:

CL /P /C myprogram.c

Điều này sẽ tạo ra một tệp gọi là myprogram.i . Mở nó và xem ra các bộ tiền xử lý mở rộng của bạn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.