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?
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?
Yanıtlar:
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):
/E
: stdout'a önişleme (GCC'nin -E seçeneğine benzer)/P
: dosyaya önişleme/EP
: #line yönergeleri olmadan stdout'a önişleme#Line yönergeleri olmayan bir dosyaya önişleme yapmak istiyorsanız, /P
ve /EP
seçeneklerini birleştirin .
/P
obj 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.
VS Developer command prompt
içeride ve NOT içinde olduğunuzdan emin olun . Derleyici geleneksel comand isteminde kullanılamaz. Command prompt
cl
Ç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.
Çö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).
Release
. Debug
) Bir uzantı ile oluşturulur .i
.
Ö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 .
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 .
Visual Studio'da bir dosyayı (veya projeyi) / P ile derleyebilirsiniz.
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.
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.