2017-11-16 9 views
-2

今まで#define ABC CDEは単にABCをCDEで置き換えるだけのプリプロセッサを作成すると思っていましたが、それは完全に真実ではないようです。私はロガーを持っていると私はこのようにそれを使用することができます:私は、エイリアスを作成したい#defineを正しく使用する

Log* pLog=new Log(..) 
*pLog<<"something"<<endl; 

便利な使用のために:

#define COUT *pLog 
COUT<<"something"<<endl 

を私は

error: ‘pLog’ was not declared in this scope 

の#define行いませ得ます単にCOUTを* pLogで置き換えるだけではありませんか?

編集:私は以下に示唆したように最小限の例を作りました。それで、#defineについての質問に答えました。それは正しいです。残りの質問は、実際の環境ではうまくいかない理由ですが、ここで議論するにはあまりにも複雑です。

EDIT2:解決済み。 COUTは正しく交換されましたが、* pLogは特定の状況では定義されていませんでした。申し訳ありませんが、実際の設定は複雑でデバッグは難しかったです。

+2

たとえば、[coliru](http://coliru.stacked-crooked.com/)へのリンクで[mcve]を作成してください。これはうまくいくように見えますが、問題は表示されていないコードにあります。 – nwp

+3

別名を作る正しい方法は 'auto&COUT = * pLog;'です。 – nwp

+1

@nwp可能であれば、はい。しかし、このマクロは、 'pLog'の宣言が複数ある場合に動作し、異なるコンテキストに異なる変数を指定します。 – aschepler

答えて

1

コンパイラはpLogが宣言されていないと言っています。

#define COUT *pLog 
Log* pLog=new Log(..) 
COUT<<"something"<<endl; 
関連する問題