2016-07-22 7 views
0

マクロに続く引数をマクロに引き渡すことなく、次のコードステートメントを使用するCマクロ、GCCディレクティブまたはプラグマはありますか?このような次のコードステートメントを使用するCマクロまたはGCCディレクティブ

何か:

#define CONSUME_NEXT_IF(a) if (a) { (<next>) } else; 

そして私はとしてそれを使用します。

CONSUME_NEXT_IF(a) stmt1; 

そして、それはに拡大することを期待:

if (a) stmt1; 
    else; 

私はここif文を使用しています例のように。条件文は、実際には引数として渡さずに、マクロによってstmt1を消費する機能ではなく、ポイントではありません。 atrue(または非ゼロ)である場合

+1

'(a)&&'はすべきです。 – EOF

+0

@ EOF、あなたは詳しく教えていただけますか? – John

+0

Mhh、実際には必ずしも機能しません。 'stmt1'が常に括弧で囲まれているか、' &&'より優先度の低い演算子が含まれていないことを確認する必要があります。 – EOF

答えて

2
#define CONSUME_NEXT_IF(a) if (!(a)) {} else 

のみ(マクロの使用と次;間)「次のステートメント」を実行する効果を達成します。式aのタイプに適した制約がある場合はを(a)に削除することができます。

個人的には、アノテーションに似た効果が必要だとコメントで説明しましたが、コード難読化を含むメンテナンスの懸念が軽減されると考えています。特に、aまたはstmt1で使用されている他のマクロと相互作用する場合。

もちろん、マクロを使用するには "大きなコードベース"を変更する必要があります。

実行ファイルにもデッドコードが残っています。stmt1が実行ファイルに出力されることはありません(aに固定のコンパイル時の値が設定されていない限り、このような状況でコードを検出して最適化できます)。したがって、このような構成は、デッドコードの防止を必要とするいくつかの保証基準の要件を満たすことができないことを意味します。

+0

コードゴルフを心配している人は、#define CONSUME_NEXT_IF(a)if(!(a));括弧を取り除くことによってオペレータの優先順位を損なうリスクを減らすのではなく、いくつかの文字を節約するために「else」を使用しますか? – EOF

+0

私はコードゴルフに関心がありません – Peter

関連する問題