2016-03-21 6 views
0

オブジェクトのようなマクロを使うのか、関数のようなマクロを使うのか混乱することがよくあります。私はhereについて書いています。したがって、オブジェクトのようなマクロの置換リストは、リテラルまたはリテラルのリストのいずれかになります。識別子の後ろに式があれば関数のようなマクロを使うべきでしょうか?関数のようなマクロとオブジェクトのようなマクロ

#define FIRST 1 //object-like 
#define INCREASE_A_AND_B() do{++a;++b;}while(0) //functuion-like 
#define ORED  (FIRST | 5) //func or object? ORED or ORED()? 

いずれかの方法を使用するときには、誰かが何らかの光を放つと大いに感謝します。それはパラメータリストなしで定義されたため、ここで

+0

シンボルをより使い慣れたものにする。 – Hairi

+0

落札を説明してください。 – Hairi

答えて

3
#define ORED  (FIRST | 5) 

OREDは、オブジェクトのようなマクロです。お試しください:

ORED  → (FIRST | 5) 
ORED()  → (FIRST | 5)() // Error: Object 5 not callable 

マクロの使用方法は、定義方法によって異なります。しかし、マクロには特別な規則があります。マクロへの引数リストの開始括弧は、マクロ名の直後に指定する必要があります。

#define MACRO(X) // function-like macro hat expands to nothing 
#define MACRO (X) // object-like macro that expands to (X) 

ほとんどのコンパイラを使用すると、マクロ展開後の前処理後のコード、つまりはどのようなものか見てみましょう:マクロ名と括弧の間の空白文字は、オブジェクトのようなマクロを定義します。 gccには-Eフラグがあり、Microsoftのclには '/ E'があります。

+0

パラメータリストは必須ではありません。パラメータなしで関数のようなマクロを持つかもしれません。 – Hairi

+1

空のパラメータリスト( 'INCREASE_A_AND_B'のように)もパラメータリストです。このようなマクロを括弧なしで使用すると、展開されません。オブジェクトのようなものと機能的なものの違いは、マクロ定義内のパラメータリストの存在です。 –

+0

私は今見ます:)ありがとう! – Hairi

関連する問題