5

"example.cpp:34"プリプロセッサを使用してフォームの静的文字列を生成したいのですが、__FILE__マクロは展開さ"lib/example/example.cpp"れ、整数として__LINE__展開されます。34プリプロセッサで目的の文字列を作成できますか? GCC 拡張は問題ありません。

編集ここで最も重要な部分は、静的な C スタイルの文字列が必要なため、basename関数を使用できないことです。おそらくブースト拡張機能を使用して、プリプロセッサにその機能を複製する方法があるかどうか疑問に思っていますか?

4

4 に答える 4

2

隣接する文字列リテラルが連結されているという事実を利用できます。

#define STRINGIFY(s) #s
#define FILELINE(line) __FILE__ ":" str(line)

次に、のように使用しFILELINE(__LINE__)ます。私はこれを頻繁に行うわけではないので、__LINE__マクロを渡すよりも良い方法があるかもしれません。とにかく私にとってはうまくいきます:

#include <iostream>

#define str(s) #s
#define FILELINE(line) __FILE__ ":" str(line)

int main(int argc, const char* argv[])
{
  std::cout << FILELINE(__LINE__) << std::endl;
  return 0;
}

私は得る:

main.cpp:9
于 2012-11-21T18:27:59.550 に答える
0

ベース名を取得する方法はわかりませんが、それ以外の場合は、次のように文字列化プリプロセッサ演算子「#」を使用できます。

#define M__(x,y) x ":" #y
#define M_(x,y) M__(x, y)
#define M M_(__FILE__, __LINE__)

今度Mはに展開し"lib/example/example.cpp:34"ます(その行のそのファイルにそれを置いた場合、ofc :))

于 2012-11-21T18:32:01.780 に答える
0

const C文字列に展開するbasename()だけで使用できるはずです__FILE__

__FILE__ このマクロは、C 文字列定数の形式で、現在の入力ファイルの名前に展開されます。

printf ("%s:%d\n", basename(__FILE__), __LINE__);
于 2012-11-21T18:27:29.863 に答える
0

プリプロセッサを使用する必要があるだけでなく、エンド ユーザーには表示されません。

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__))

しかし、これがあなたが望んでいたものかどうかはわかりません....

于 2012-11-21T23:01:31.093 に答える