プロが教える店舗&オフィスのセキュリティ対策術

C言語においてのマクロの仕様を教えてください。
(1)マクロ内でコメントは不可なのでしょうか?
(2)マクロ内で変数定義は不可なのでしょうか?
 マクロは実行された場所に展開されるだけの認識ですので、
 マクロ内で変数宣言されている場合、関数の先頭でしかマクロが使えない?

よろしくお願い致します。

----以下作成コード----

#define TESTMACRO(result,a,b) \
do{ \
int tmpData = 5; \
if( a=0){ \
result = -1; \
continue; \
} \
if( b=0){ \
result = -1; \
continue; \
} \
result = a*b*100; \
}while(0)

int main(){
int result = 0;

/* 他の処理 */
TESTMACRO(result,a,b);

 /* 結果resultのログ表示 */

}

A 回答 (5件)

(1)コメントはすでにあった通り、/* */なら問題無し。


(2)については、どちらとも言えない。

マクロは文字を置き換えるだけです。「正しい」かどうかは、その置き換わった後のソースコードがC言語として正しいかどうかによります。

例えば
#define print(a) }
と定義すれば
void func(){ print("Hello World")
等と、一見、括弧忘れの間違いのように見えるソースコードが、実は「文法的に正しい」ソースになったりします。
(動作内容は別として)


ちなみに、今回のに関しては別の問題があります。
if( a=0){ \
if( b=0){ \
を=から==に直したとしても、
TESTMACRO( result, 1+1, 1-1 ) ;
と呼び出したとき、期待通りでは無いはずです。
    • good
    • 0

(1)マクロ内でコメントは不可なのでしょうか?



利用可能です。

C言語では、
1. \(バックスラッシュ)による改行の削除
2. コメントの削除
3. マクロの展開
の順で処理されます。

そのため、//による一行コメントはマクロ内では正しく使えないことが多いです。
/**/によるコメントであれば普通に利用できます。


(2)マクロ内で変数定義は不可なのでしょうか?マクロは実行された場所に展開されるだけの認識ですので、マクロ内で変数宣言されている場合、関数の先頭でしかマクロが使えない?

定義可能です。定義したマクロはどこでも利用できます。

C言語では、 変数は"ブロック"の先頭で宣言および定義しなければいけません。
つまり、マクロ全体を{}でくくってしまえばマクロ内で普通に変数定義できます。
また、C99以降であればこの制限もありません。

ただし、変数名の衝突には十分注意してください。


(1), (2)のいずれも、しっかり注意しないとバグの元となるので気をつけてください。
    • good
    • 1

処理系が分からない以上「規格を読め」で終わるのかもしれませんが....



そのような疑問を持つにいたった理由なんかは明らかにできませんか?
    • good
    • 0

>(1)マクロ内でコメントは不可なのでしょうか?


>(2)マクロ内で変数定義は不可なのでしょうか?

実際にそういうコードを書いてみて、思ったとおりに動けば
「ああ、できるんだ」ということが実感できると思います。
    • good
    • 0

そもそも、



>if( a=0){ \
>if( b=0){ \

ここは何をしようとしていますか?
もし、aやbが0と等しいかどうかをチェックしようとしているのであれば、
思ったとおりの動きはしないと思います。

比較演算子の仕様を確認なさる方がいいような気がします。
    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!