Visual Studio'da önişlemeden sonra bir C / C ++ kaynak dosyasını nasıl görebilirim?


206

Diyelim ki birçok önişlemci direktifine sahip bir kaynak dosyam var. Önişlemci ile yapıldıktan sonra nasıl göründüğünü görmek mümkün müdür?


Hangi derleyiciyi kullandığınız gibi daha fazla bilgi vermeniz size yardımcı olacaktır.
JaredPar

Şu anda IDE olarak Visual Studio 2005 kullanıyorum.
Geo

Sonra varsayılan olarak cl.exe derleyicisini kullanıyorsunuz.
Martin York

3
VS2005 kullandığını söylediğinde neden bir gcc cevabı kabul edildi?
Jim Buck

Yanıtlar:


147

cl.exe, Microsoft Visual C ++ komut satırı arabirimi, önceden işlenmiş dosyayı çıktı için üç farklı seçenek vardır (bu nedenle önceki Visual C ++ hakkında önceki yanıtlarda tutarsızlık):

#Line yönergeleri olmayan bir dosyaya önişleme yapmak istiyorsanız, /Pve /EPseçeneklerini birleştirin .


1
Bu komutları nmake ve Makefile ile bir projeye nasıl iletirim?
WooDzu

@WooDzu Visual C ++ projeleri geleneksel bir makefile kullanarak görevleri otomatikleştirmek için NMAKE (nmake.exe) kullanın. ~ msdn.microsoft.com/en-us/library/f35ctcxw.aspx
G.Rassovsky

8
Lütfen /Pobj dosyalarının oluşturulmasını engelleyecektir. Bu nedenle /P, seçenekleri koyarsanız , aslında hiç oluşturulmadığı için bazı obj dosyalarının bulunamadığını söyleyen bir hata alabilirsiniz.
smwikipedia

MS derleyicisini ( ) kullanmaya çalışırken VS Developer command promptiçeride ve NOT içinde olduğunuzdan emin olun . Derleyici geleneksel comand isteminde kullanılamaz. Command promptcl
dmytro.poliarush

VS2019 Topluluk: / P LNK 1104 hatası hala basında sıcak.
Laurie Stearn

119

Çoğu derleyicinin önişlemciyi çalıştırma seçeneği vardır. ör . gcc -E sağlar:

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

Böylece sadece koşabilirsiniz:

gcc -E foo.c

Böyle bir seçenek bulamazsanız, makinenizde sadece C ön işlemcisini de bulabilirsiniz. Genellikle cpp denir ve muhtemelen zaten yolunuzdadır. Şöyle çağırın:

cpp foo.c

Diğer dizinlerden eklemeniz gereken başlıklar varsa, normal bir derlemede yaptığınız gibi, bunlardan birine -I / path / to / include / dir iletebilirsiniz.

Windows için, orada uzman olmadığım için cevaplar vermek için diğer posterlere bırakacağım.



100

Çözüm Gezgini'nde dosyayı sağ tıklayın, Özellikler'e gidin. Yapılandırma Özellikleri-> C / C ++ -> Önişlemci altında, "Önceden İşlenmiş Dosya Oluştur" aradığınız şeydir. Ardından, Çözüm Gezgini'nde dosyayı sağ tıklayın ve "Derle" yi seçin. Önceden işlenmiş dosya çıkış dizininde (ör. Release, Debug) .i uzantısıyla oluşturulur (yorumu için Steed'e teşekkürler).


9
VS2010'da "Dosyaya Önişleme".
Rob W

18
BTW, dosya çıkış dizininde (ör Release. Debug) Bir uzantı ile oluşturulur .i.
Steed

1
Bu, tüm doğru başlıkları bulmak için projede önceden ayarlanmış olan yapı yapılandırmasını kullandığından çok yardımcı olur.
IanH

Not benim için MSVC 2015 tarihinde, .ı dosya değildi Output Directory , ancak projenin içinde Orta Directory . CMake kullanarak projelerinizi oluşturursanız bunlar aynı değildir.
user1556435

19

Önişlemcinin çıktısında genellikle bazı postprocess işlemleri yapmanız gerekir, aksi takdirde tüm makrolar yalnızca bir katmana genişler, bu da okunması ve hatalarının ayıklanması zordur. C kodu için aşağıdakine benzer bir şey yeterli olacaktır:

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

C ++ kodu için, aslında çok daha zor. GCC / g ++ için bu Perl betiğini yararlı buldum .


8

Microsoft derleyicisi hakkında hiçbir şey bilmiyorum, ancak GCC'de bunu kullanabilirsiniz:

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

Yorumları görmek istiyorsanız şunu kullanın:

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

Bu sayfada daha fazla seçenek mevcuttur .


1
Bu aynı zamanda qcc.exe gibi gcc türetilmiş derleyiciler ile çalışır - teşekkürler!
adaçayı

8

cl /EPMicrosoft'un C ++ derleyicisini kullanıyorsanız deneyin .



5

Bk1e ve Andreas M. yanıtladığı gibi, derleyici için / P seçeneği, dosyanın bir dosyayı önceden işlemesine neden olacaktır. Ancak, VS2005 ve Platform Builder (katıştırılmış ARM işlemcisi için) kullanan projemde, proje bu seçeneği etkinleştirmek için iletişim kutusunda (Jim B tarafından açıklandığı gibi) bir seçenek sunmadı.

CL'yi manuel olarak çalıştırabilir ve / P ekleyebilirim, ancak başarısız oldu, çünkü tam derleme sırasında Platform Builder tarafından görünmez bir şekilde etkinleştirilen tüm uygun komut satırı seçeneklerini bilmiyordum. Bu yüzden tüm bu seçenekleri bilmem gerekiyordu.

Benim çözümüm build.log dosyasına bakıp yürütülen satırı bulmaktı

CL blah-blah-blah myfile.c

Bu satırı panoya kopyaladım. "Blah-blah-blah" kısmı yapı seçeneklerini içeriyordu ve çok büyüktü.

Geri IDE, myfile.c sağ tıklayın, "Open Build Window" seçti ve sonra bu pencerede build komut satırı yapıştırdı ve bir "/ P" ekledi.

CL /P blah-blah-blah myfile.c

Bitti. Önişlemci çıktısını içeren myfile.i dosyası üretildi.


2

CPIP , Python'da yazılmış yeni bir C / C ++ ön işlemcisidir . Önceden işlenmiş bir dosyanın ayrıntılı bir görsel temsilini istiyorsanız, bunu deneyin.

CPIP, Python'da uygulanan bir C / C ++ ön işlemcisidir. Çoğu önişlemci, ön işlemeyi en kısa zamanda yapılması gereken kirli bir iş olarak görür. Bu, ön işlemciler sonucu mümkün olduğunca ucuza almak için çok sayıda yararlı bilgi attığından, ön işleme aşamasında ince kusurları izlemeyi çok zorlaştırabilir.

Çok az geliştirici gerçekten ön işlemeyi anlıyor, birçoğu için belirsiz bir kara büyü. CPIP bunu geliştirmeyi ve ön işlemenin her ayrıntısını kaydederek CPIP'in dosya bağımlılıkları, makro kullanımı vb. Hakkında harika görsel bilgiler üretmesini amaçlamaktadır.

CPIP, cpp (veya başka bir yerleşik ön işlemci) yerine kullanılmak üzere tasarlanmamıştır, bunun yerine CPIP, netliği ve anlayışı işlem hızından daha önemli olarak görür.


2

Windows işletim sisteminde, bu sorunun basit bir satır cevabı, önceden işlenmiş dosyayı görmek için DOS komut isteminde aşağıdaki komutu kullanmaktır:

CL /P /C myprogram.c

Bu adlı bir dosya oluşturur myprogram.i . Açın ve genişletilmiş ön işlemcilerinize dikkat edin.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.