21

私は C でのプログラミングの経験はある程度ありますが、自分が熟練しているとは言えません。最近、次のマクロに遭遇しました。

#define CONST(x) (x)

通常、次のような式で使用されます。

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

このマクロのポイントに完全に困惑し、マクロの長所/短所とプロパティを広範囲に調査しましたが、この特定のマクロの用途が何であるかはまだわかりません. 何か不足していますか?

4

7 に答える 7

11

質問に示されているように、マクロが何もしないのは正しいです。

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

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

于 2013-01-31T15:54:32.600 に答える
6

一部の (古い) C コンパイラはこのキーワードをサポートしておらずconst、このマクロはおそらく、さまざまなコンパイラを処理するより精巧な一連のマクロを思い起こさせるものです。のように使用しx = CONST(2.0)*y;ても意味がありません。

詳細については、Autoconf ドキュメントのこのセクションを参照してください。

編集: このマクロの別の目的は、Qt フレームワークのメタ オブジェクト コンパイラが行うように、カスタムの前処理 (たとえば、特定の定数を抽出および/または置換するため) である可能性があります。

于 2013-01-31T16:18:42.587 に答える
2

そのマクロの利点はまったくなく、それを書いた人は混乱しているに違いありません。コードは と完全に同等x = 2.0*y;です。

于 2013-01-31T15:54:11.853 に答える
0

このマクロには、マクロ展開中に x を括弧で囲む効果があります。

誰かが次のようなものを許可しようとしていると思います

CONST(3+2)*y

括弧なしでは、次のようになります

3+2*y

しかし、括弧で

(3+2)*y

以前の開発ライフでは、このようなものが必要だったことを思い出すようです。

于 2013-02-07T19:08:32.097 に答える
0

このマクロのもう 1 つの良い点は、次のようなものです。

result=CONST(number+number)*2;

または比較に関連する何か

result=CONST(number>0)*2;

このマクロに問題があるとすれば、おそらく名前です。この「CONST」は定数とは関係ありませんが、他の何かと関係があります。作者がそれを CONST と呼んだ理由を知るために、コードの残りの部分を探すとよいでしょう。

于 2013-01-31T20:14:18.410 に答える
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;
于 2013-01-31T16:06:03.480 に答える