Eh, sadece önişlemci kullanılmalıdır - ama son kullanıcıya görünmeyecektir.
Eğer BASENAME()
istediğiniz
bazı dosyada kullanılacak - Bu başlık dosyasını
basename.h
kullanın:
// basename.h
#include <string.h>
static size_t basename_start_calc(const char* filename)
{
const char* base = strrchr(filename, '/');
return base ? (base - filename + 1) : 0;
}
static inline size_t basename_start(const char* filename)
{
static size_t retval = basename_start_calc(filename);
return retval;
}
#define STR_(t) #t
#define STR(t) STR_(t)
#define BASENAME() ((__FILE__ ":" STR(__LINE__)) + basename_start(__FILE__))
bir ideone example here.
basename_start(__FILE__)
verilen kaynak dosyası için yalnızca bir kez değerlendirilecektir. Maalesef bu çözümü başlık dosyalarında kullanamazsınız - sadece kaynak dosyalarında. Bunu değiştirebilirsiniz, bu yüzden her yerde kullanılabilir - ancak verilen dosya adı için taban çizgisinin başlangıcı her seferinde hesaplanacaktır. Sadece bu otomatik olabilir en iyisi inanıyoruz
BASENAME()
basename_start_calc(__FILE__)
yerine
basename_start(__FILE__)
...
kullanmak.Her dosya makroda elle tanımlayabilirsiniz Tabii
:
#define BASENAME() ("somefile.cpp:" STR(__LINE__))
ama istediğinin bu olduğundan emin değilim ....
mi C++ 11 tamam mı? Önişlemcide veya derleme zamanında kullanılabilen dizgiyi mi olmalı? – kennytm
@KennyTM Hayır, C++ 11 kullanamıyorum. Derleme zamanında istiyorum. Boost da iyidir. –
Ya da '__FILE__' kullanmayın, ancak her bir ilgili dosyanın üstüne kendi dizginizi hazırlayın. – chill