Có cách di động nào để in tin nhắn từ bộ tiền xử lý C không?


99

Tôi muốn có thể làm điều gì đó như

#print "C Preprocessor got here!"

cho mục đích gỡ lỗi. Cách tốt nhất / di động nhất để làm điều này là gì?

Câu trả lời:


114

Các warningchỉ thị có lẽ là gần nhất bạn sẽ nhận được, nhưng nó không hoàn toàn nền tảng độc lập:

#warning "C Preprocessor got here!"

AFAIK này hoạt động trên hầu hết các trình biên dịch ngoại trừ MSVC, trên đó bạn sẽ phải sử dụng một pragmachỉ thị:

#pragma message ( "C Preprocessor got here!" )

5
Điều này đặt ra câu hỏi, bạn có thể đặt một chỉ thị dựa trên cờ biên dịch để hoán đổi "thông điệp pragma" và "cảnh báo" bằng cách nào đó không? Ví dụ, một cái gì đó như: #ifdef _LINUX #define #preprocmsg "#warning" else #define #preprocmsg "#pragma message"... Tôi sẽ phải thử điều đó nhưng bản năng cho tôi biết câu trả lời là không.
Bryan

11
@Bryan: Vâng. #define WARNING(msg) _Pragma("message " #msg)
Matt Joiner

1
#pragma message () không được các phiên bản gcc cũ hơn (chẳng hạn như gcc 4.1.2, phiên bản mặc định trên RHEL5) hỗ trợ. Tôi vẫn chưa tìm thấy phiên bản tương đương thích hợp cho các phiên bản cũ hơn này - #warning sẽ không tốt lắm, vì các cảnh báo thường được coi là lỗi đối với chúng tôi và chúng tôi thực sự muốn thông báo mang tính thông tin, thay vì dừng việc biên dịch.
Danny S

6
Đưa ra cảnh báo là rất bất tiện khi dự án của bạn biên dịch với -Wall theo mặc định. Thông báo #pragma không có vấn đề đó.
Renan Gemignani

56

Phần sau được hỗ trợ bởi MSVCGCC .

#pragma message("stuff")
#pragma message "stuff"

Clang đã bắt đầu thêm hỗ trợ gần đây, hãy xem tại đây để biết thêm.


3
Chỉ đối với bản ghi, Solaris Studio 12.3 (Sun C 5.12) không hỗ trợ pragma này.
maxschlepzig

Hoạt động với Arduino 1.8 bằng Visual Studio vMicro. Cảm ơn!
save_jeff

12

Bạn có thể muốn thử: #pragma message("Hello World!")


9

Hầu hết các trình biên dịch C sẽ nhận ra một #warningchỉ thị, vì vậy

 #warning "Got here"

Ngoài ra còn có chỉ thị '#error' tiêu chuẩn,

 #error "Got here"

Mặc dù tất cả các trình biên dịch đều hỗ trợ điều đó, nhưng nó cũng sẽ dừng quá trình biên dịch / tiền xử lý.


6
#pragma message("foo")

hoạt động tốt. Cũng sẽ không ngừng biên dịch ngay cả khi bạn sử dụng -Werror


0

Một giải pháp khác là sử dụng các chú thích cùng với một tập lệnh shell để xử lý chúng. Điều này đòi hỏi một số kỷ luật (hoặc một tập lệnh shell mắc lỗi chính tả).

Ví dụ: tôi thêm các nhận xét được định dạng //TODOvà sau đó là một tập lệnh shell thu thập tất cả chúng vào một báo cáo.

Đối với các trường hợp sử dụng phức tạp hơn, bạn có thể thử viết bộ tiền xử lý đơn giản của riêng mình. Ví dụ: bạn có thể chỉnh sửa các nguồn của mình dưới dạng *.c2tệp. Bộ tiền xử lý đơn giản sẽ đọc nguồn, tìm kiếm //TODOvà ghi printf("TODO ...")vào *.ctệp đầu ra .


-17

Bạn không thể. Các bộ tiền xử lý được xử lý trước mã C. Không có chỉ thị tiền xử lý nào để in ra màn hình, vì mã tiền xử lý không được thực thi, nó được sử dụng để tạo mã C sẽ được biên dịch thành mã thực thi.

Có gì sai với:

#ifdef ...
printf("Hello");
#endif

Bởi vì đây là tất cả những gì bạn có thể làm trong phạm vi các bộ tiền xử lý.


5
Điều này sẽ không in trong thời gian biên dịch, đó là những gì tôi nghĩ OP đang tìm kiếm.
Bob Kaufman

Tôi cho rằng ý của anh ấy là in ngay lúc chạy.
Alexander Rafferty

1
Tôi đã hỏi về thời gian biên dịch. Cảm ơn!
Andrew Wagner
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.