2011-09-13 14 views
6

Kodumdan tanılama iletileri yazdırmak için __FILE__ ve __LINE__ makrolarını kullanıyorum. Bu, GCC'yi make ile kullandığınızda oldukça iyi çalışır, dosya komut satırında belirttiğiniz kadar kısadır. Yakın zamanda, binalarda tam nitelikli dosya adlarını (en azından pencerelerin altında) kullanan CodeLite'ı kullanmaya başladım. Aniden teşhis teşhisim neredeyse okunamıyor.Önişlemcide yalnızca dosya adı nasıl alınır?

Sadece önişlemde dosya adının dosya bileşenini almanın bir yolu var mı? Taşınabilir olmayan bir GCC'ye özel çözümle yaşayabilirim.

Tabii bir işlevi aracılığıyla __FILE__ içeriğini geçmek ve yalnızca dosya bileşeni çıkarabilir (ı. Sade __FILE__ Diğer durumlarda son çare olacaktır), ancak string işlemleri ı değiştirmemelidir teşhis mesajları için aklındakini değildi çalışma zamanı ...

NOT: Dosya adını GNU'nun kullandığı şekilde kullanıyorum. Bir yol, dosya adlarının toplanmasıdır ve dosya adı, bir dosyanın göreli veya mutlak tanımlayıcısıdır. Bir dosya adı bir dizin bileşeni ve dosya bileşeninden oluşabilir.

+0

Tanılama, çalışma zamanı davranışını değiştirir (aksi halde tanılama olmaz) ve fazladan bir işlev çağırıp çağırmamanız çok küçük bir fark yaratır, çünkü çıktı zaten çıktı yapmak için kitaplık işlevlerini çağırıyordur. – eudoxos

+0

Bir tanılama iletisi yazdırmak, düzinelerce dize işlemine ek olarak, bazı iyi niyetli olmayan dosya I/O eylemlerini içerir. Bazı sebeplerden dolayı kimse bunun için endişelenmiyor. Neden sadece tanılama mesajlarını etkileyen başka bir yan-efektli fonksiyona çağrı ekleme konusunda endişeleniyorsunuz? –

+0

İkiniz de haklısınız, ekleyerek tanılama etkisizdir. Bu şekilde uyguladım, bir işlevden geçmesine izin verdim. Daha çok var gibi bir şey merak ediyordum. Kesinlikle standart değildir, ancak bununla ilgili belgelerin bulunması mükemmel değildir. (Gcc kılavuzu bile önceden tanımlanmış her makroyu çizmez.) – rioki

cevap

3

İşlevselliği sağlayan bilinen bir önişlemci makrosu yoktur. __FILE__'u bir işlev aracılığıyla geçmek, tek mantıklı seçenek gibi dikişler.

+0

gcc için [\ _ \ _ BASE_FILE \ _ \ _] var (https://gcc.gnu.org/onlinedocs/cpp/Common-Predefined-Macros.html). – fret

+1

@fret: '__BASE_FILE__', '__FILE__' ile aynı çıktıyı veriyor. Bağlandığınız belgeleri okursanız, dosyanın (ana dosya adı değil) “ana” işleviyle (geçerli dosyaya değil) adını verir. – JellicleCat

+1

@JellicleCat haklısınız ... – fret

8

Eğer GNU Make kullanıyorsanız, derlemenin ön-işlem aşamasında -D BASE_FILE_NAME = \ "$ *. C \" ifadesini kolayca geçirebilirsiniz (eğer ayrı ayrı yapıyorsanız ya da tek bir derlemede derleme yapıyorsanız) norm olan sahne. Bu, dosya adlarınızın belirlenme şeklinize bağlıdır. Benimki düz dosya isimleri listesinden geliyor ve daha sonraki bir aşamada makefile fonksiyonlarını kullanarak dizinleri ile önek.

IE, bu benim için iyi çalışıyor, ancak kilometre durumunuz değişebilir! :-)

benim marka "kod" basitleştirilmiş versiyonu:

CLASSES = main.c init.c 

PREPROCESSED = $(patsubst %.c,$(PPCDIR)/%.pp.c,$(CLASSES)) 

$(PREPROCESSED): $(PPCDIR)/%.pp.c: %.c $(ALLH) 
    $(GCC) $(GCCOPTS) -D BASE_FILE_NAME=\"$*\" -E $< > [email protected] 

sen :-)

+0

Maalesef, CodeLite ile çalışıyorum, bu benim için makefiles üretir. CodeLite'ı kullanmak, normdan düşecek bir şey yapmak istediğinizde mükemmeldir. Hala güzel ideea, +1 – rioki

+0

Aynı fikir Visual Studio'da kullanılabilir. Visual Studio 2008'de: proje dosyasına sağ tıklayın (.vcproj) -> Özellikler -> Yapılandırma Özellikleri -> C/C++ -> Önişlemci -> Önişlemci Tanımları. __BASE_FILE __ = \ "$ (InputFileName) \" ekleyin. Kaynak dosyalarınızda __FILE__ yerine __BASE_FILE__ kullanabilirsiniz. – user720594

4

yukarıda FredCooke cevap olarak istediğiniz gibi kodunuzda sadece kullanım BASE_FILE_NAME, sen alışverişi yapabilir Bu satırı:

-D BASE_FILE_NAME=\"$*.c\" 

olarak:

-D BASE_FILE_NAME=\"$(<F)\" 

Bu, .cpp için de uygun dosya adı genişletme sağlar.

İlgili konular