2012-07-16 17 views
6

私は__FILE____LINE__マクロをコンストラクタでデフォルトのパラメータとして使用しようとしていますが、マクロを取得して正しいファイルを使用できないようです。彼らは私のヘッダーファイルから拡張し続けます。C++のコンストラクタで__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に変換され、コードページの型が浮動小数点数として書き換えられます。または、うまくいけば...。

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

+3

短い答え:あなたは好きなように使用することはできません。コンストラクタのソースコードが記述されている場所に展開されます。つまり、プリプロセッサの動作です。これは、 "関数パラメータ"などについて何も知らないテキスト処理エンジンです。コンパイラは、関数や引数などを実際に扱うものは、プリプロセッサが終了した後に来ます。 – Xeo

+1

コンストラクタの代わりにマクロを使用する必要があります。他の方法では機能しません。つまり、汎用コードでは完全に失敗します。 –

+0

私のマネージャーはシングルトンですか?スマートなソリューション! – steffen

答えて

2

これを行うことはできません。これらの2つのマクロは、プリプロセッサに遭遇したときにそれらを置き換えるため、ヘッダファイル名とライン番号に交換されます。

6

これはプリプロセッサで行うことができます。 __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"; 
}  
0

ザ・OPが編集に書いた:

をそれは容易ではありませんでしたが、R.マルティーニ・フェルナンデスは、正しい道に私を設定します。私はスレッドセーフだとは思わないが、それはこれまでのところうまくいきます。

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

これはどのように動作します。

float test = 0.5; 

そして私は、このように変更します。:私はこれを取る

私のヘッダファイルで
mnFloat test = 0.5; 

、mnFloatはそうのように定義される:2へ

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

ので、コードページの変更をその行の命令と行番号は増加しません。そしてそれは動作します!

+0

([質問に回答してコミュニティのwikiに変換しました](http://meta.stackoverflow.com/questions/267434/what-is-the-appropriate-action-when-the-answer-to-a-疑問に追加された質問) –

関連する問題