まあ、プリプロセッサだけでなく、エンドユーザには見えません。
あなたはBASENAME()
は、いくつかのファイルで使用することにしたい - このヘッダファイル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__))
ideone example hereを。
basename_start(__FILE__)
は、指定されたソースファイルに対して1回だけ評価されます。残念ながら、ヘッダーファイルではこのソリューションを使用することはできません。ソースファイルでのみ使用できます。あなたはそれを変更することができるのでどこでも使用できます - しかし、与えられたファイル名のベースラインの開始は毎回計算されます。 basename_start(__FILE__)
の代わりにBASENAME()
basename_start_calc(__FILE__)
で使用してください...
これは自動的に行うことができます。あなたはすべてのファイルのマクロに手で定義することができます。もちろん
:
#define BASENAME() ("somefile.cpp:" STR(__LINE__))
が、私はこれがあなたが望んでいることを確認していない....
ですC++ 11 OK?プリプロセッサで使用可能な文字列か、コンパイル時に使用できる文字列でなければなりませんか? – kennytm
@KennyTMいいえ、私はC++ 11を使用できません。私はコンパイル時にそれをしたい。ブーストも大丈夫です。 –
または '__FILE__'を使用しないで、それぞれのファイルの上に独自の文字列リテラルを定義してください。 – chill