プリプロセッサを使用する必要があるだけでなく、エンド ユーザーには表示されません。
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__))
ここにイデオンの例があります。
basename_start(__FILE__)
指定されたソース ファイルに対して 1 回だけ評価されます。残念ながら、このソリューションはヘッダー ファイルでは使用できません。ソース ファイルでのみ使用できます。変更できるので、どこでも使用できますが、指定されたファイル名のベースラインの開始は毎回計算されます。...BASENAME()
basename_start_calc(__FILE__)
の代わりに使用するだけですbasename_start(__FILE__)
これが自動的にできる最善の方法だと思います。
もちろん、すべてのファイル マクロで手動で定義できます。
#define BASENAME() ("somefile.cpp:" STR(__LINE__))
しかし、これがあなたが望んでいたものかどうかはわかりません....