มีวิธีแบบพกพาในการพิมพ์ข้อความจากตัวประมวลผลล่วงหน้า C หรือไม่?


101

ฉันต้องการที่จะทำสิ่งที่ชอบ

#print "C Preprocessor got here!"

เพื่อวัตถุประสงค์ในการดีบัก วิธีใดที่ดีที่สุด / พกพาสะดวกที่สุดในการทำเช่นนี้

คำตอบ:


120

warningสั่งน่าจะใกล้เคียงที่สุดที่คุณจะได้รับ แต่ก็ไม่ได้ทั้งแพลตฟอร์ม:

#warning "C Preprocessor got here!"

AFAIK นี้ใช้ได้กับคอมไพเลอร์ส่วนใหญ่ยกเว้น MSVC ซึ่งคุณจะต้องใช้pragmaคำสั่ง:

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

5
คำถามใดที่ทำให้เกิดคำถามคุณสามารถวางคำสั่งตามแฟล็กการรวบรวมเพื่อสลับ "ข้อความ pragma" และ "คำเตือน" ได้หรือไม่? ตัวอย่างเช่น: #ifdef _LINUX #define #preprocmsg "#warning" else #define #preprocmsg "#pragma message"... ฉันจะต้องลอง แต่สัญชาตญาณบอกฉันว่าคำตอบคือไม่
ไบรอัน

11
@ ไบรอัน: ใช่ #define WARNING(msg) _Pragma("message " #msg)
Matt Joiner

1
#pragma message () ไม่รองรับ gcc เวอร์ชันเก่า (เช่น gcc 4.1.2 เวอร์ชันเริ่มต้นบน RHEL5) ฉันยังไม่พบสิ่งที่เทียบเท่าที่เหมาะสมสำหรับเวอร์ชันเก่าเหล่านี้ - # คำเตือนจะไม่ค่อยดีนักเนื่องจากคำเตือนถือเป็นข้อผิดพลาดสำหรับเราโดยทั่วไปและเราต้องการให้ข้อความเป็นข้อมูลแทนที่จะหยุดการรวบรวม
Danny S

6
การออกคำเตือนไม่สะดวกเมื่อโปรเจ็กต์ของคุณคอมไพล์ด้วย -Wall #pragma ข้อความไม่มีปัญหานั้น
Renan Gemignani

56

ต่อไปนี้จะได้รับการสนับสนุนโดยMSVCและGCC

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

Clang ได้เริ่มเพิ่มการสนับสนุนเมื่อเร็ว ๆ นี้ดูข้อมูลเพิ่มเติมที่นี่


3
สำหรับบันทึก Solaris Studio 12.3 (Sun C 5.12) ไม่รองรับ pragma นี้
maxschlepzig

ทำงานร่วมกับ Arduino 1.8 โดยใช้ Visual Studio vMicro ขอบคุณ!
save_jeff


9

คอมไพเลอร์ C ส่วนใหญ่จะรู้จัก#warningคำสั่งดังนั้น

 #warning "Got here"

นอกจากนี้ยังมีคำสั่ง '#error' มาตรฐาน

 #error "Got here"

แม้ว่าคอมไพเลอร์ทั้งหมดจะรองรับสิ่งนั้น แต่ก็จะหยุดการคอมไพล์ / การประมวลผลล่วงหน้าด้วย



0

อีกวิธีหนึ่งคือการใช้ความคิดเห็นและเชลล์สคริปต์เพื่อประมวลผล สิ่งนี้ต้องใช้ระเบียบวินัย (หรือเชลล์สคริปต์ที่จับการพิมพ์ผิด)

ตัวอย่างเช่นฉันเพิ่มความคิดเห็นที่จัดรูปแบบ//TODOแล้วเชลล์สคริปต์ซึ่งรวบรวมความคิดเห็นทั้งหมดไว้ในรายงาน

สำหรับกรณีการใช้งานที่ซับซ้อนมากขึ้นคุณสามารถลองเขียนตัวประมวลผลล่วงหน้าแบบธรรมดาของคุณเอง ตัวอย่างเช่นคุณสามารถแก้ไขแหล่งที่มาของคุณเป็น*.c2ไฟล์ได้ พรีโปรเซสเซอร์อย่างง่ายจะอ่านซอร์สค้นหา//TODOและเขียนprintf("TODO ...")ลงใน*.cไฟล์เอาต์พุต


-17

คุณทำไม่ได้ ตัวประมวลผลล่วงหน้าจะถูกประมวลผลก่อนรหัส C ไม่มีคำสั่งพรีโปรเซสเซอร์ที่จะพิมพ์ไปยังหน้าจอเนื่องจากโค้ดของตัวประมวลผลล่วงหน้าไม่ได้ถูกเรียกใช้งานจึงถูกใช้เพื่อสร้างรหัส C ซึ่งจะรวบรวมเป็นโค้ดที่เรียกใช้งานได้

มีอะไรผิดพลาด:

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

เพราะนี่คือทั้งหมดที่คุณสามารถทำได้เท่าที่ตัวประมวลผลล่วงหน้าไป


5
สิ่งนี้จะไม่พิมพ์ในเวลาคอมไพล์ซึ่งเป็นสิ่งที่ฉันคิดว่า OP กำลังมองหา
Bob Kaufman

ฉันคิดว่าเขาหมายถึงการพิมพ์ในเวลาทำงาน
Alexander Rafferty

1
ฉันถามเกี่ยวกับเวลาคอมไพล์ ขอบคุณ!
Andrew Wagner
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.