Bene, non deve essere utilizzato solo il preprocessore, ma non verrà visualizzato all'utente finale.
Quando si desidera BASENAME()
da utilizzare in qualche file - usano questo file di intestazione basename.h
:
// 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__))
An ideone example here.
basename_start(__FILE__)
verrà valutato solo una volta per il file sorgente specificato. Purtroppo non è possibile utilizzare questa soluzione nei file di intestazione, solo nei file di origine. Puoi cambiarlo, quindi può essere usato ovunque, ma l'inizio della baseline per il nome file specificato verrà calcolato ogni volta. Basta usare in BASENAME()
basename_start_calc(__FILE__)
invece di basename_start(__FILE__)
...
Credo che questo è meglio che si può avere automaticamente.
Naturalmente è possibile definire manualmente in ogni file di macro:
#define BASENAME() ("somefile.cpp:" STR(__LINE__))
ma non sono sicuro che questo è quello che si voleva ....
è C++ 11 ok? La stringa deve essere utilizzabile nel preprocessore o solo in fase di compilazione? – kennytm
@KennyTM No, non posso usare C++ 11. Lo voglio al momento della compilazione. Anche la spinta va bene. –
O non utilizzare '__FILE__', ma definire il proprio valore letterale di stringa sopra ogni file di interesse. – chill