ฉันจะดูไฟล์ต้นฉบับ C / C ++ ได้อย่างไรหลังจากประมวลผลล่วงหน้าใน Visual Studio


206

สมมติว่าฉันมีไฟล์ต้นฉบับที่มีคำสั่ง preprocessor มากมาย เป็นไปได้หรือไม่ที่จะดูว่ามันดูแลตัวประมวลผลล่วงหน้าด้วยหรือไม่


มันจะช่วยถ้าคุณให้ข้อมูลเพิ่มเติมเช่นคอมไพเลอร์ที่คุณใช้อยู่
JaredPar

ปัจจุบันฉันใช้ Visual Studio 2005 เป็น IDE ของฉัน
Geo

จากนั้นโดยค่าเริ่มต้นคุณกำลังใช้คอมไพเลอร์ cl.exe
Martin York

3
ทำไมคำตอบ gcc จึงเป็นที่ยอมรับเมื่อเขาบอกว่าเขาใช้ VS2005
Jim Buck

ที่เกี่ยวข้อง: ข้อมูลคอมไพเลอร์
Laurie Stearn

คำตอบ:


147

cl.exeอินเตอร์เฟสบรรทัดคำสั่งไปยัง Microsoft Visual C ++ มีสามตัวเลือกที่แตกต่างกันสำหรับการส่งออกไฟล์ที่ประมวลผลล่วงหน้า (ดังนั้นความไม่สอดคล้องกันในการตอบสนองก่อนหน้าเกี่ยวกับ Visual C ++):

หากคุณต้องการประมวลผลไฟล์ล่วงหน้าโดยไม่มีคำสั่ง #line ให้รวมตัวเลือก/Pและ/EP


1
ฉันจะส่งคำสั่งเหล่านี้ไปยังโครงการด้วย nmake และ Makefile ได้อย่างไร
WooDzu

@WooDzu ใช้ NMAKE (nmake.exe) เพื่อทำงานที่สร้างโครงการ Visual C ++ โดยอัตโนมัติโดยใช้ makefile แบบดั้งเดิม ~ msdn.microsoft.com/en-us/library/f35ctcxw.aspx
G.Rassovsky

8
โปรดทราบว่า/Pจะระงับการสร้างไฟล์ obj ดังนั้นหากคุณใส่/Pตัวเลือกคุณอาจได้รับข้อผิดพลาดในการเชื่อมโยงว่าบางไฟล์ obj ไม่สามารถพบได้เพราะมันไม่ได้ถูกสร้างขึ้นเลย
smwikipedia

ตรวจสอบให้แน่ใจว่าคุณอยู่ในVS Developer command promptและไม่เข้าCommand promptเมื่อพยายามใช้ MS คอมไพเลอร์ ( cl) คอมไพเลอร์ไม่พร้อมใช้งานในคำสั่ง comand แบบธรรมดา
dmytro.poliarush

ชุมชน VS2019: ข้อผิดพลาด/ P LNK 1104ยังร้อนแรงจากการกด
Laurie Stearn

119

คอมไพเลอร์ส่วนใหญ่มีตัวเลือกเพียงแค่เรียกใช้พรีโปรเซสเซอร์ เช่น 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 ฉันจะปล่อยให้ผู้โพสต์คนอื่นเพื่อให้คำตอบเพราะฉันไม่มีความเชี่ยวชาญ



100

คลิกขวาที่ไฟล์ใน Solution Explorer แล้วไปที่ Properties ภายใต้คุณสมบัติการกำหนดค่า -> C / C ++ -> ตัวประมวลผลล่วงหน้า "สร้างไฟล์ที่ประมวลผลล่วงหน้า" คือสิ่งที่คุณกำลังมองหา จากนั้นคลิกขวาที่ไฟล์ใน Solution Explorer แล้วเลือก "รวบรวม" ไฟล์ที่ถูกประมวลผลล่วงหน้าถูกสร้างขึ้นในไดเรกทอรีผลลัพธ์ (เช่น Release, Debug) พร้อมด้วยนามสกุล. i (ขอบคุณ Steed สำหรับความคิดเห็นของเขา)


9
"ประมวลผลล่วงหน้าเป็นไฟล์" ใน VS2010
Rob W

18
BTW ไฟล์จะถูกสร้างขึ้นในไดเรกทอรีเอาท์พุท (เช่นRelease, Debug) .iที่มีส่วนขยาย
ม้า

1
สิ่งนี้ช่วยได้มากเนื่องจากใช้การกำหนดค่าการสร้างที่ตั้งค่าไว้แล้วในโครงการเพื่อค้นหาส่วนหัวที่เหมาะสมทั้งหมด
IanH

หมายเหตุสำหรับฉันใน MSVC 2015 แฟ้ม .i ไม่ได้อยู่ในขาออกสารบบแต่ในโครงการไดเรกทอรีระดับกลาง สิ่งเหล่านี้จะไม่เหมือนกันถ้าคุณสร้างโครงการโดยใช้ CMake
user1556435

19

โดยทั่วไปคุณต้องทำการประมวลผลบางอย่างบนเอาต์พุตของตัวประมวลผลล่วงหน้ามิฉะนั้นแมโครทั้งหมดจะขยายไปยังหนึ่ง liners ซึ่งยากต่อการอ่านและดีบัก สำหรับรหัส C สิ่งต่อไปนี้จะพอเพียง:

gcc -E code.c | sed '/^\#/d' | indent -st -i2 > code-x.c

สำหรับรหัส C ++ มันยากกว่านี้มาก สำหรับ GCC / g ++ ฉันพบนี้ Perl สคริปต์ที่มีประโยชน์


8

ฉันไม่รู้อะไรเกี่ยวกับคอมไพเลอร์ของ Microsoft แต่ใน GCC คุณสามารถใช้สิ่งนี้:

gcc -E -P -o result.c my_file.h

หากคุณต้องการเห็นความคิดเห็นใช้สิ่งนี้:

gcc -E -C -P -o result.c my_file.h

ตัวเลือกเพิ่มเติมสามารถใช้ได้ในหน้านี้


1
นอกจากนี้ยังใช้งานได้กับคอมไพเลอร์ที่ได้มาจาก gcc เช่น qcc.exe - ขอบคุณ!
ปราชญ์



5

ในฐานะที่เป็น 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 ถูกสร้างขึ้นซึ่งมีเอาต์พุตตัวประมวลผลล่วงหน้า


2

CPIPเป็นตัวประมวลผลล่วงหน้า C / C ++ ใหม่ที่เขียนด้วย Python หากคุณต้องการการแสดงภาพโดยละเอียดของไฟล์ที่ประมวลผลล่วงหน้าให้ทำการช็อต

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

ผู้พัฒนาเพียงไม่กี่คนที่เข้าใจการประมวลผลล่วงหน้าเป็นอย่างมากสำหรับคนส่วนใหญ่มันเป็นเวทมนตร์ดำมืดมน CPIP มีจุดมุ่งหมายเพื่อปรับปรุงและบันทึกทุกรายละเอียดของการประมวลผลล่วงหน้าเพื่อให้ CPIP สามารถสร้างข้อมูลภาพที่น่าอัศจรรย์เกี่ยวกับการขึ้นต่อกันของไฟล์การใช้งานมาโครและอื่น ๆ

CPIP ไม่ได้ถูกออกแบบมาให้ใช้แทน cpp (หรือ pre-processor อื่น ๆ ที่จัดตั้งขึ้น) แต่ CPIP จะให้ความชัดเจนและความเข้าใจที่สำคัญกว่าความเร็วในการประมวลผล


2

บน Windows OS คำตอบเดียวสำหรับคำถามนี้คือการใช้คำสั่งด้านล่างใน DOS prompt เพื่อดูไฟล์ที่ประมวลผลล่วงหน้า:

CL /P /C myprogram.c

นี้จะสร้างไฟล์ที่เรียกว่าmyprogram.i เปิดและดูตัวประมวลผลล่วงหน้าที่ขยายเพิ่มของคุณ

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