2010-03-10 13 views
9

bir C dosyada belirli bir noktada GNU C Preprocessor, cpp'nin (veya başka bir araç) liste mevcut tüm makro ve değerlerini yapmak için bir yolu var mı?İlanı C Sabitler/Makrolar

Zaten sisteme özel makrolar ararken, zaten bilinmeyen bir program yüklerken ve çok az sayıda unix sistem dosyası yüklüyorum.

Sadece tanımlar için avlanmanın daha kolay bir yolu olup olmadığını merak ediyorum.

+3

İlginç bir soru ... belki de niyetinizi dahil etmek size daha iyi bir cevap verecektir? – fbrereto

cevap

15

Bir dosyada belli bir noktada bilmem ama kullanan yok:

$ touch emptyfile 
$ cpp -dM emptyfile 

Dumps tüm varsayılan olanları. İçerisinde bir C dosyası için #include ve #define satırları ile aynı şeyi yapmak, bunların tümünü de içerir. Dosyanı umursadığın noktaya kesebilirsin ve sonra aynısını yapabilirsin? man page kaynaktan

:

-dCHARS
CHARS aşağıdaki karakterleri bir veya daha fazla bir sekans ve bir boşluk karakteri olmamalıdır. Diğer karakterler derleyici tarafından yorumlanır veya GCC'nin gelecekteki sürümleri için ayrılır ve bu nedenle sessizce göz ardı edilir. Davranışları çelişen karakterler belirtirseniz, sonuç tanımsızdır.

M
yerine, normal çıktı, önceden tanımlanmış makroları da içeren önişlemci yürütülmesi sırasında tanımlanan tüm makrolar için #define direktifleri bir listesini oluşturacaktır. Bu, size ön işlemcinin sürümünde önceden tanımlanmış olanı bulmak için bir yol sağlar. Foo.h dosyasının bulunmadığı farz edilerek,

tüm ön tanımlı makroları gösterir. Eğer -E seçeneğinin olmadığı -dM kullanırsanız

, -dM-fdump-rtl-mach ile eşanlamlı olarak yorumlanır. İki bakımdan hariç M gibi

D
: Bu ön tanımlı makro içermez ve #define direktifleri ve ması sonucu hem çıkarır. Her iki çıkış türü standart çıktı dosyasına gider.

N
D gibi, ancak yalnızca makro adlarını yayarlar, genişlemelerini değil. ması sonucu ilaveten

I
Çıktı #include direktifleri.

+1

Sadece merak ediyorum - neden foo.h' komutu gerekli? –

+0

@Michael, bir dosya adı argümanı olmadan "cpp -dM", "stdin" ile ilgili verileri bekler. Bunu yapabilir ve '^ D' yazabilir, ancak boş bir dosya oluşturmak daha kolaydır. –

+0

Teşekkürler, 'touch'ın boş bir dosya oluşturmanın kolay bir yolu olduğunu unuttum. –

0

Neden Predefined-macros numaralı bölüme başvurmuyorsunuz? Bir proje ya da böyle bir şey inşa etmek için buna ihtiyacınız var mı?

+0

Evet * önceden tanımlanmış makrolar * gcc kılavuzunun iyi bir bölümüyse de, sisteme özgü makroları araştırırken, zaten bilinmeyen bir program yüklüyor ve çok az sayıda unix sistem dosyası yüklüyor. Sadece tanımlar için avlanmanın daha kolay bir yolu olup olmadığını merak ediyorum. – ZJR

0

, derlenmiş özellikle, bir C dosyasında belirli bir noktayı göstermek ve izlemek için yararlı kabul olacağını iki yoktur makroları kullanarak "C dosyasında belirli bir noktada kendi değerlerini" listelemek için başarısızlık bir nokta ... foo.c adlı bir dosyada bu örnek kodu göz önünde bulundurun: bu kod mantığı bu dosyada birkaç kez kullanıldıysa

 
if (!(ptr = malloc(20))){ 
    fprintf(stderr, "Whoops! Malloc Failed in %s at line %d\n", __FILE__, __LINE__); 
} 

ve malloc çağrısı başarısız oldu, olur Bu çıkışı al:

 
Whoops! Malloc Failed in foo.c at line 25 

Satır numarası, kaynağın neresinde bulunduğuna bağlı olarak farklı olabilir, mantık kullanılır. Bu örnek, bu makronun nerede kullanılacağını gösterme amacına hizmet eder ...

1

gcc ile, tüm makro tanımlarını stdout'a dökmek için "-dD" seçeneğini kullanabilirsiniz. İşte

0

komut satırı seçenekleri hakkında genel bilgi veren bir sayfa için bir link ön tanımlı makro çoğu derleyici (gcc, clang ...) için listelemektir.

+0

... ve cevap her zaman "-d" Bu 5 yıl önce yanıtlandı, rtfm necromancer. Bu cevabın amacını özlüyorum. – ZJR