สมมติว่าฉันมีไฟล์ต้นฉบับที่มีคำสั่ง preprocessor มากมาย เป็นไปได้หรือไม่ที่จะดูว่ามันดูแลตัวประมวลผลล่วงหน้าด้วยหรือไม่
สมมติว่าฉันมีไฟล์ต้นฉบับที่มีคำสั่ง preprocessor มากมาย เป็นไปได้หรือไม่ที่จะดูว่ามันดูแลตัวประมวลผลล่วงหน้าด้วยหรือไม่
คำตอบ:
cl.exe
อินเตอร์เฟสบรรทัดคำสั่งไปยัง Microsoft Visual C ++ มีสามตัวเลือกที่แตกต่างกันสำหรับการส่งออกไฟล์ที่ประมวลผลล่วงหน้า (ดังนั้นความไม่สอดคล้องกันในการตอบสนองก่อนหน้าเกี่ยวกับ Visual C ++):
/E
: preprocess เป็น stdout (คล้ายกับตัวเลือก -E ของ GCC)/P
: preprocess เป็นไฟล์/EP
: preprocess เป็น stdout โดยไม่มี #line directivesหากคุณต้องการประมวลผลไฟล์ล่วงหน้าโดยไม่มีคำสั่ง #line ให้รวมตัวเลือก/P
และ/EP
/P
จะระงับการสร้างไฟล์ obj ดังนั้นหากคุณใส่/P
ตัวเลือกคุณอาจได้รับข้อผิดพลาดในการเชื่อมโยงว่าบางไฟล์ obj ไม่สามารถพบได้เพราะมันไม่ได้ถูกสร้างขึ้นเลย
VS Developer command prompt
และไม่เข้าCommand prompt
เมื่อพยายามใช้ MS คอมไพเลอร์ ( cl
) คอมไพเลอร์ไม่พร้อมใช้งานในคำสั่ง comand แบบธรรมดา
คอมไพเลอร์ส่วนใหญ่มีตัวเลือกเพียงแค่เรียกใช้พรีโปรเซสเซอร์ เช่น gcc ให้ -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.
ดังนั้นคุณสามารถเรียกใช้:
gcc -E foo.c
หากคุณไม่พบตัวเลือกดังกล่าวคุณสามารถค้นหาตัวประมวลผลล่วงหน้า C บนเครื่องของคุณได้ โดยปกติจะเรียกว่า cpp และอาจอยู่ในเส้นทางของคุณแล้ว เรียกใช้แบบนี้:
cpp foo.c
หากมีส่วนหัวที่คุณต้องรวมจากไดเรกทอรีอื่นคุณสามารถส่ง -I / path / to / include / dir ไปยังส่วนใดส่วนหนึ่งได้เช่นเดียวกับที่คุณคอมไพล์ปกติ
สำหรับ Windows ฉันจะปล่อยให้ผู้โพสต์คนอื่นเพื่อให้คำตอบเพราะฉันไม่มีความเชี่ยวชาญ
คลิกขวาที่ไฟล์ใน Solution Explorer แล้วไปที่ Properties ภายใต้คุณสมบัติการกำหนดค่า -> C / C ++ -> ตัวประมวลผลล่วงหน้า "สร้างไฟล์ที่ประมวลผลล่วงหน้า" คือสิ่งที่คุณกำลังมองหา จากนั้นคลิกขวาที่ไฟล์ใน Solution Explorer แล้วเลือก "รวบรวม" ไฟล์ที่ถูกประมวลผลล่วงหน้าถูกสร้างขึ้นในไดเรกทอรีผลลัพธ์ (เช่น Release, Debug) พร้อมด้วยนามสกุล. i (ขอบคุณ Steed สำหรับความคิดเห็นของเขา)
Release
, Debug
) .i
ที่มีส่วนขยาย
โดยทั่วไปคุณต้องทำการประมวลผลบางอย่างบนเอาต์พุตของตัวประมวลผลล่วงหน้ามิฉะนั้นแมโครทั้งหมดจะขยายไปยังหนึ่ง liners ซึ่งยากต่อการอ่านและดีบัก สำหรับรหัส C สิ่งต่อไปนี้จะพอเพียง:
gcc -E code.c | sed '/^\#/d' | indent -st -i2 > code-x.c
สำหรับรหัส C ++ มันยากกว่านี้มาก สำหรับ GCC / g ++ ฉันพบนี้ Perl สคริปต์ที่มีประโยชน์
ฉันไม่รู้อะไรเกี่ยวกับคอมไพเลอร์ของ Microsoft แต่ใน GCC คุณสามารถใช้สิ่งนี้:
gcc -E -P -o result.c my_file.h
หากคุณต้องการเห็นความคิดเห็นใช้สิ่งนี้:
gcc -E -C -P -o result.c my_file.h
ตัวเลือกเพิ่มเติมสามารถใช้ได้ในหน้านี้
ลองcl /EP
ถ้าคุณใช้คอมไพเลอร์ C ++ ของ Microsoft
ใน Visual Studio คุณสามารถรวบรวมไฟล์ (หรือโครงการ) ด้วย / P
ในฐานะที่เป็น bk1e และ Andreas M. ตอบตัวเลือก / P สำหรับคอมไพเลอร์จะทำให้มันประมวลผลไฟล์ล่วงหน้า อย่างไรก็ตามในโครงการของฉันที่ใช้ VS2005 และ Platform Builder (สำหรับตัวประมวลผล ARM แบบฝังตัว) โครงการไม่ได้แสดงตัวเลือกในกล่องโต้ตอบ (ดังอธิบายโดย Jim B) เพื่อเปิดใช้งานตัวเลือกนั้น
ฉันสามารถเรียกใช้ CL ด้วยตนเองและเพิ่ม / P แต่มันล้มเหลวเพราะฉันไม่รู้จักตัวเลือกบรรทัดคำสั่งที่เหมาะสมทั้งหมดซึ่งถูกเปิดใช้งานโดยตัวสร้างแพลตฟอร์มอย่างล่องหนระหว่างการสร้างแบบเต็ม ดังนั้นฉันจำเป็นต้องรู้ตัวเลือกทั้งหมดเหล่านั้น
โซลูชันของฉันคือไปดูในไฟล์ build.log และค้นหาบรรทัดที่ดำเนินการ
CL blah-blah-blah myfile.c
ฉันคัดลอกบรรทัดนี้ไปยังคลิปบอร์ด ส่วน "blah-blah-blah" มีตัวเลือกการสร้างและมีขนาดใหญ่มาก
ย้อนกลับไปใน IDE ฉันคลิกขวาที่ myfile.c เลือก "เปิดหน้าต่างสร้าง" จากนั้นในหน้าต่างนั้นฉันวางบรรทัดคำสั่งการสร้างและเพิ่ม "/ P"
CL /P blah-blah-blah myfile.c
เสร็จสิ้น ไฟล์ myfile.i ถูกสร้างขึ้นซึ่งมีเอาต์พุตตัวประมวลผลล่วงหน้า
CPIPเป็นตัวประมวลผลล่วงหน้า C / C ++ ใหม่ที่เขียนด้วย Python หากคุณต้องการการแสดงภาพโดยละเอียดของไฟล์ที่ประมวลผลล่วงหน้าให้ทำการช็อต
CPIP เป็นตัวประมวลผลล่วงหน้า C / C ++ ที่ใช้งานใน Python ตัวประมวลผลล่วงหน้าส่วนใหญ่ถือว่าการประมวลผลล่วงหน้าเป็นงานที่สกปรกซึ่งต้องดำเนินการโดยเร็วที่สุด สิ่งนี้สามารถทำให้ยากมากที่จะติดตามข้อบกพร่องเล็กน้อยในขั้นตอนการประมวลผลล่วงหน้าเนื่องจากตัวประมวลผลล่วงหน้าจะทิ้งข้อมูลที่มีประโยชน์มากมายเพื่อให้ได้ผลลัพธ์ที่มีราคาถูกที่สุด
ผู้พัฒนาเพียงไม่กี่คนที่เข้าใจการประมวลผลล่วงหน้าเป็นอย่างมากสำหรับคนส่วนใหญ่มันเป็นเวทมนตร์ดำมืดมน CPIP มีจุดมุ่งหมายเพื่อปรับปรุงและบันทึกทุกรายละเอียดของการประมวลผลล่วงหน้าเพื่อให้ CPIP สามารถสร้างข้อมูลภาพที่น่าอัศจรรย์เกี่ยวกับการขึ้นต่อกันของไฟล์การใช้งานมาโครและอื่น ๆ
CPIP ไม่ได้ถูกออกแบบมาให้ใช้แทน cpp (หรือ pre-processor อื่น ๆ ที่จัดตั้งขึ้น) แต่ CPIP จะให้ความชัดเจนและความเข้าใจที่สำคัญกว่าความเร็วในการประมวลผล
บน Windows OS คำตอบเดียวสำหรับคำถามนี้คือการใช้คำสั่งด้านล่างใน DOS prompt เพื่อดูไฟล์ที่ประมวลผลล่วงหน้า:
CL /P /C myprogram.c
นี้จะสร้างไฟล์ที่เรียกว่าmyprogram.i เปิดและดูตัวประมวลผลล่วงหน้าที่ขยายเพิ่มของคุณ