2013-01-31 10 views
21

私はC言語でのプログラミングでいくつかの経験を持っていますが、私は自分自身を熟達したと呼ぶことはないでしょう。Cマクロ:明らかに役に立たないマクロの利点/意図

#define CONST(x) (x) 

私はそれが一般的に例えばのような式で使用見つける:完全にこのマクロの時点で困惑

double x, y; 
x = CONST(2.0)*y; 

、私は広範囲に長所/短所を調査 最近、私は次のマクロに遭遇しましたとマクロのプロパティが、私はまだこの特定のマクロの使用が何であるか把握することはできません。何か不足していますか?

+2

このマクロは、何かが定数であることをビジュアルリマインダとして以外の何も得られません。 –

+2

これを行うために私が考えることができる唯一の理由は、外部ツールがプログラム内の特定の定数。それは時々翻訳されるテキストをマーキングするために使用されますが、私はそれがここでどのように役立つか分かりません – jcoder

+2

それはそれを検索可能にします – Minthos

答えて

11

質問に示されているように、マクロは何もしません。

これは、誰かがそのコードを書いた人によって課された人工的な構造のようで、定数がどこにあるかを豊富に確認して検索することができますか?私は検索可能な定数を持つ利点を見ることができますが、これはその目標を達成するための最良の方法ではありません。

これは、実装されていないか、部分的にしか削除されていない他のマクロスキームの一部であった可能性もあります。

+1

+1、私はこれについても考えることができます。 –

+5

それはまともではない、正気のプログラマーは "マジックナンバー"を使うのではなく、代わりに '#define SOME_FLOAT 2.0'を、その後に' x = SOME_FLOAT * y; 'を続けます。また、適切であれば、 'const'変数を使用してください。 – Lundin

+2

const変数は 'それほど優れていません'。それは有害だと考えられています。 –

2

マクロの利益はまったくなく、誰でもそれを書いた人は混乱しなければなりません。コードはx = 2.0*y;と完全に等価です。

1

マクロ拡張を回避する必要がある場合は、この種のマクロを実際に役立てることができます。
このような必要性の典型的な例は、ストリング化マクロです。例については、次の質問を参照してください。C Preprocessor, Stringify the result of a macro

具体的には、極端なドキュメンテーションやコードの解析の目的からは得られません。

+0

私も以前のSOの投稿で私の研究で遭遇したストリンジェフィケーションマクロについての良い点http://stackoverflow.com/questions/1597007/creating-c-macro-with-and-line-token-concatenation-with- positioning-macrしかし、私が見つけたコードでは、それはそのようには使用されません – Pankrates

0

別の用途は、将来の関数呼び出し、このようなものとして、これらの値を予約することができます

/* #define CONST(x) (x) */ 
#define CONST(x) some_function(x) 

// ... 

double x, y; 
x = CONST(2.0)*y; // x = some_function(2.0)*y; 
6

一部(旧)Cコンパイラがconstキーワードをサポートしていないと、このマクロはおそらく回想であります異なるコンパイラを扱うマクロのより複雑なシーケンス。 x = CONST(2.0)*y;のように使用しても意味がありません。

詳しくはthis section from the Autoconf documentationをご覧ください。

EDIT:QtフレームワークのMeta Object Compilerのように、このマクロのもう1つの目的はカスタムの前処理(特定の定数の抽出や置換)です。このマクロでいくつかの問題がある場合

0

このマクロについてのもう一つの良いところは、比較

result=CONST(number>0)*2; 

に関連し、この

result=CONST(number+number)*2; 

か何かのようなものになるだろう、それはおそらく名前です。この "CONST"のことは定数と関連するものではなく、他のものと関連しています。作者がそれをCONSTと呼んだ理由を知るためにコードの残りの部分を探すとよいでしょう。

0

このマクロは、マクロ展開時にxの前後にかっこをラップする効果があります。

私は誰かが括弧なしで、

3+2*y 

になるだろう、

CONST(3+2)*y 

の線に沿って何かを可能にしようとしているが、括弧で

(3+2)*y 
になっている推測しています

以前の開発ではこのようなことが必要だったことを思い出しています。