7

__FILE__コンストラクターでおよびマクロをデフォルトのパラメーターとして使用しようとしてい__LINE__ますが、マクロが適切なファイルを使用するようには見えません。彼らは私のヘッダーファイルから展開し続けます。

詳細: クラスのメンバーとしてオブジェクトがインスタンス化されるファイルと行番号が必要です。しかし、オブジェクトを使用するたびにパラメーターを手動で入力する必要はありません。これを行う方法があることは知っていますが、一生それを理解することはできません。私が現在行っていることは次のとおりです。

私のヘッダーファイルでは:

mnNumber( float x, const char* filename = __FILE__, int linenumber = __LINE__ ): 
          value( x ), mFileName( filename ), mFunctionName( nullptr ), mLineNumber(     linenumber ), mID( 0 )

しかし、FILELINEは、mnNumber を使用する実際の場所ではなく、ヘッダー ファイルからのものであるかのように展開されます。

なぜこれをやりたいのかという質問に答えるために、コードに独自のコードページを読み取らせたいと思います。私が使用する特定の値はマネージャーに登録されており、その値はエンド ユーザーが編集できます。エンド ユーザーが値の編集を完了すると、値はコード ページに書き戻されます。そのため、その値がどこから来たのかを知る必要があります。また、エンド ユーザーがこの値を再度編集する必要はないと言うことを許可します。ユーザーがそのボタンをクリックすると、値が mnNumber から float に変換され、コードページの型が float として書き換えられます。 . または、そうなるでしょう...うまくいけば。

私へのアドバイスはありますか?

4

3 に答える 3

8

プリプロセッサでこれを行うことができます。__LINE__展開して使用するマクロを作成します。

struct S {
  S(int line, const std::string& file) :
    line(line), file(file) {
  }
  std::string file;
  int line;
};

#define SCons() S(__LINE__, __FILE__)

int main () {

  S s1 = SCons();
  S s2 = SCons();
  std::cout << s1.line << "\n";
  std::cout << s2.line << "\n";
}       
于 2012-07-16T02:40:13.370 に答える
2

これはできません。これら 2 つのマクロは、プリプロセッサが検出したときに置き換えられるため、ヘッダー ファイル名と行番号に置き換えられます。

于 2012-07-16T02:27:37.977 に答える
0

OPは編集で書いた:

簡単ではありませんでしたが、R. Martinho Fernandes は私を正しい道に導いてくれました。スレッドセーフではないと思いますが、これまでのところ機能しています。

私が欲しかったのは、タイプを mnFloat に変更するだけでフロートを追跡および更新する機能でした。そして、マネージャーで関数を呼び出してファイル、行、および関数名を追加し、float を特殊な型に変更する定義をセットアップしました。マネージャー内では、それらはすべて ID でリンクされています。register 関数を呼び出すと、保存するオブジェクトを内部的に作成します。同じ行で、私の特別なタイプも作成され、マネージャーに登録されます。どちらのオブジェクトも同じ種類の ID システムを使用します (ID は、新しいオブジェクトが作成されるたびに増加する静的な番号からコピーすることによって生成されます)。これらは同じコード ページに表示されるため、ID は常に同じであり、同期がずれることはありません。私がマルチスレッドに行かないと仮定すると、私は思います。不正行為のように感じますが、うまくいきます:)

仕組みは次のとおりです。私はこれを取ります:

float test = 0.5;

そして、これを次のように変更します。

mnFloat test = 0.5;

私のヘッダー ファイルでは、mnFloat は次のように定義されています。

#define mnFloat myManager::getInstance()->register(__FILE__,__FUNCTION__,__LINE__);mnNumber

そのため、コードページはその行の 2 つの命令に変更され、行番号は増加しません。そしてそれはうまくいきます!

于 2016-06-27T18:33:53.347 に答える