2009-07-15 17 views
0

マクロの初心者を助けてください...イメージをロードするための単純なマクロを作成し、それを複数の行に分割して、マクロから生成されたコードが(デバッグ用に)実行されるたびにログできるようにしました。それは次のようになります。マクロのコメント行

#define LOAD_PNG(L_I_IMAGE_NAME) ({ \ 
PngImageClass* __tmp; \ 
printf("Loading png: %s", L_I_IMAGE_NAME);\ 
__tmp = [image loading code here];\ 
__tmp; \ 
}) 

私の計画は、必要なときに簡単にログの行(手動)をコメントアウトすることができるようになったが、プリプロセッサは、通常の方法のいずれかを容認しません。どのようにそれを行う必要がありますか?

EDIT:私は1行のコメントだけを試してみるほど怠け者だったので、それは "正常な方法のいずれも"うまくいかないと言うのは完全に間違っていました。私はまた、いくつかのレスポンダからのアドバイスを参考にして、これを機能に変えます。いいえ、このためにマクロを使用する理由はありません(私は推測します)。

+4

関数の代わりにマクロを使用する理由はありますか?これは、マクロが良いアイデアである場所のようには見えません。 – Eric

答えて

10

あなたはこのようにそれを行うことができます。

#define LOAD_PNG(L_I_IMAGE_NAME) ({ \ 
PngImageClass* __tmp; \ 
/*printf("Loading png: %s", L_I_IMAGE_NAME);*/\ 
__tmp = [image loading code here];\ 
__tmp; \ 
}) 

シングルラインは、あなたが、具体的の最後にバックスラッシュ(\)を提供することで、行を継続するコンパイラを求めているので、動作しません単に//コメントすべての行。

+0

コメントは、行末のバックスラッシュの前に停止する必要があります。さもなければ、ラインは一緒にスプライスされず、マクロ定義にすべて含まれるわけではありません。 (つまり、3行目は "\ * /"ではなく "*/\"を終了する必要があります) –

+0

あなたは正しいです、修正済みです。指摘してくれてありがとう。 – Aamir

2

マクロはすべて1行(行継続によって)であるため、 '#if 0'または '//'形式のコメントは使用できません。/** /正常に動作するはずです。

あなたが投稿したスニペットから、これはとにかくマクロになるはずはありません。マクロは、何らかの形でテキスト置換を利用する場合(たとえば、変数と変数名の両方が必要な場合)にのみ使用してください。

1

なぜマクロステートメントの周りにかっこがありますか?これはプリプロセッサの問題を抱えていてもコンパイルされません。/... /スタイルのコメントに加えて

+0

それはコンパイルされますが、なぜ私がそれらを使用したのか覚えていません。それは、私が一度コピーしたマクロから来たものでも、混乱したテストセッションの結果でもあります。覚えていない。私はかっこを削除します:) – Felixyz

+0

それは変です。あなたのようなカッコでいくつかのコードをコンパイルしようとしましたが、コンパイルされませんでした。参考までに私はcygwinでgcc 3.4.4と一緒に使っていました。 – Key

0

、あなたはこれを行うことができます。

if (0) printf(...); 

良い方法がない限り、しかし、マクロを使用し、代わりに関数にそれを回すないことですマクロを使用するのは本当に重要な理由があります(しかし、あなたは何も与えませんでした)。

+0

これは最適化されませんでしたが、そうですか? – Felixyz

+0

それは完全にコンパイラに依存します。そのような明白なケースであるので、私はそれを最適化するためにまともなコンパイラを期待するだろう。 –

+0

実際、Ubuntu上のgccは-Oオプションを使わなくても最適化されているようです。 –