- 締切済み
マクロ内での変数定義
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のログ表示 */ }
- yuji8000
- お礼率0% (0/30)
- C・C++・C#
- 回答数5
- ありがとう数0
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- kmee
- ベストアンサー率55% (1857/3366)
(1)コメントはすでにあった通り、/* */なら問題無し。 (2)については、どちらとも言えない。 マクロは文字を置き換えるだけです。「正しい」かどうかは、その置き換わった後のソースコードがC言語として正しいかどうかによります。 例えば #define print(a) } と定義すれば void func(){ print("Hello World") 等と、一見、括弧忘れの間違いのように見えるソースコードが、実は「文法的に正しい」ソースになったりします。 (動作内容は別として) ちなみに、今回のに関しては別の問題があります。 if( a=0){ \ if( b=0){ \ を=から==に直したとしても、 TESTMACRO( result, 1+1, 1-1 ) ; と呼び出したとき、期待通りでは無いはずです。
- racene
- ベストアンサー率70% (21/30)
(1)マクロ内でコメントは不可なのでしょうか? 利用可能です。 C言語では、 1. \(バックスラッシュ)による改行の削除 2. コメントの削除 3. マクロの展開 の順で処理されます。 そのため、//による一行コメントはマクロ内では正しく使えないことが多いです。 /**/によるコメントであれば普通に利用できます。 (2)マクロ内で変数定義は不可なのでしょうか?マクロは実行された場所に展開されるだけの認識ですので、マクロ内で変数宣言されている場合、関数の先頭でしかマクロが使えない? 定義可能です。定義したマクロはどこでも利用できます。 C言語では、 変数は"ブロック"の先頭で宣言および定義しなければいけません。 つまり、マクロ全体を{}でくくってしまえばマクロ内で普通に変数定義できます。 また、C99以降であればこの制限もありません。 ただし、変数名の衝突には十分注意してください。 (1), (2)のいずれも、しっかり注意しないとバグの元となるので気をつけてください。
- Tacosan
- ベストアンサー率23% (3656/15482)
処理系が分からない以上「規格を読め」で終わるのかもしれませんが.... そのような疑問を持つにいたった理由なんかは明らかにできませんか?
- asuncion
- ベストアンサー率33% (2126/6288)
>(1)マクロ内でコメントは不可なのでしょうか? >(2)マクロ内で変数定義は不可なのでしょうか? 実際にそういうコードを書いてみて、思ったとおりに動けば 「ああ、できるんだ」ということが実感できると思います。
- asuncion
- ベストアンサー率33% (2126/6288)
そもそも、 >if( a=0){ \ >if( b=0){ \ ここは何をしようとしていますか? もし、aやbが0と等しいかどうかをチェックしようとしているのであれば、 思ったとおりの動きはしないと思います。 比較演算子の仕様を確認なさる方がいいような気がします。
関連するQ&A
- 変数宣言・変数定義のちがいって??
変数宣言・変数定義のちがいって?? 同じ意味なんでしょうか? 私の解釈では、 ・宣言っていうのは、今からこの変数を使いますよってことで。 ・定義っていうのは、実際に変数の領域をわりあてるってイメージなんですけど・・ なので、 int a; ←これは変数定義 extern int a; ←これは変数(extern)宣言 あってるでしょうか?
- 締切済み
- C・C++・C#
- マクロに関して
C言語・C++初心者です。 マクロにて、printfをレベル分けして出力したいと思っております。 下記のようにレベルを1,2に区分して、マクロを呼出して、printf上にそのレベルを出力させたいという意向です。頭ではこうしたいというものはまとまっておりますが、いざソースに起こすと、コンパイルエラーとなります。 そもそもの記述方法が検討違いなのかと思いますが、なかなかうまくいきません。 大変申し訳ございませんが、ご教授よろしくお願いいたします。 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ #include <stdio.h> // デバッグレベル1 #define DEBUGLV1(str) printf("LV[%d]:%s",1,str) // デバッグレベル2 #define DEBUGLV2(str) printf("LV[%d]:%s",2,str) int main() { //-- 変数の宣言 -------------------- int iCnt; // ループカウンタt //-- 変数の初期化 ------------------ iCnt = 0; // ループ for(iCnt=0; iCnt<2; iCnt++) { if(iCnt == 0) { DEBUGLV1("LV1LOG:iCnt[%d]\n", iCnt); } else { DEBUGLV2("LV2LOG:iCnt[%d]\n", iCnt); } } return 0; } +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- ベストアンサー
- C・C++・C#
- 引数をつけたマクロ定義とは
引数つきマクロ宣言って、どういった場面で使うのでしょうか? 例えば #define abc(a) a*a と定義している場合 x=abc(a) のabc(a)がa*aに変わる。 でも、こんなことしたら abc(a)関数を呼び出せなくなるのでは? 要するに、「引数つきのマクロ定義が ある理由などを、説明していただければと思います。
- ベストアンサー
- C・C++・C#
- ・関数内で宣言された変数の扱い(C入門本の説明で)
以下C言語入門書の説明ですが! いまいちわかりません? ・関数内で宣言された変数の扱い 関数内で宣言した関数は、その関数内でのみ有効な変数になります。関数が異なれば、同じ変 数名で宣言することができます。例えば、main関数と(?)kansuu関数で、同じ(?)hennsuuという名 前の変数を宣言することができます。 int main() { int (A)hensuu = 0; (B)kansuuu(1); } int (C)kansuu(int hikusuu) { int (D)hensuu = 10; } 列のmain関数で宣言されている(?)hensuuと、さ(?)kansuu関数で宣言されている(?)hensuuは 同じ名前ですが、独立した異なるものです。(?)kansuu関数が実行されているときに、(?)hensuuの値 を変更しても、main関数で宣言されている(?)hensuuの値は変更されません。 また、(?)kansuu関数を実行している間だけ、(?)kansuu関数で宣言されている(?)hensuuが有効です。 (?)kansuu関数から呼び出し元でるmain関数に戻った際は、(?) kansuu関数で宣言した (?)hensuuはもう有効ではなくな、値を参照することもなくなります。 以上の説目で、 (A)hensuu、 (B)kansuuu、(C)kansuu、(D)hensuu (アルファベット)を分かりやすいよう追加しました。 説明の (?)にプログラムの(A)~(D)をつけたらどうなるか知りたいです。 (何となくわかるですが?) よろしくお願いします。
- ベストアンサー
- C・C++・C#
- ”int *a,*b”というポインタ変数宣言した値でa=&bということ
”int *a,*b”というポインタ変数宣言した値でa=&bということはできる? ”int *a,*b”このような変数をグローバル宣言した場合、 a=&bというようなことはできるのでしょうか? ”int *a,*b” この宣言で、 aが10番地 bが20番地に定義されたと仮定しています。
- ベストアンサー
- C・C++・C#
- forkとグローバル変数について
上記タイトルについて質問です。 グローバル変数で定義した変数(int型) をforkで作成した子プロセス間で使用したいのですがうまくいきません。実際には以下のように定義しています。 int flg=0; main() { if(( i=fork() )==0){ flg = 1; /* こっちをA */ } else { sleep(3); printf(" flg=%d\n", flg ); /* こっちをB */ } } こういった使い方は間違いなのでしょうか? また、上記にてA側で変更したグローバル変数の値をB側でも使用することが出来る方法を教えて下さい。(グローバル変数以外でも同様の処理が行えればそれでもいいので教えて下さい。)
- ベストアンサー
- C・C++・C#
- int型変数の簡潔なプログラム
#include<iostream> using namespace std; int main(void){ int max = a; int min = a; if(a > b){ min = b; }else{ max = b; } cout << "小さい方の値は" << min << "です。\n"; cout << "大きい方の値は" << max << "です。\n"; } これの、 int max = a; int min = a; と if(a > b){ min = b; }else{ max = b; } が解りません。 何故変数をaからbにチェンジしているのでしょうか 初心者なのでお手柔らかにお願いします。 よろしくお願いします。
- ベストアンサー
- C・C++・C#
- 【#define】 defineで定義した値を配列のサイズに使う事は可能?
タイトルの通り、defineで定義した値を配列のサイズ指定に使いたいと考えています。 この場合、次のような使い方をしても問題ないのでしょうか? /* サンプルここから */ #define SIZE_A 10 #define SIZE_B 20 #define SIZE_ALL (SIZE_A * SIZE_B) cahr ARR[SIZE_ALL]; /* サンプルここまで */ コンパイル時にワーニング等はありませんが、int型という型を宣言していないSIZE_ALLを要素数として使用するのが不安に感じるのですが問題ないのでしょうか? int SIZE_int = SIZE_ALL; とdefineした値を明示的にint型変数に代入した上で、 cahr ARR[SIZE_int]; とすべきなのでしょうか? 初歩的な質問ですが、ご教示お願いします。
- ベストアンサー
- C・C++・C#
- C言語 宣言した変数になにも代入しなかった場合
int a; で整数の変数 a を宣言したとします。 ここで a になにも操作を加えなかったら、aは空っぽのままですよね? a の中身が空っぽかどうかを調べるにはどのようにすればよいのでしょうか? 例えば、整数aの中身を調べて、何か代入されていればそれを表示し、なにもない空っぽであればエラーを表示し終了するプログラムを書こうと思えばどのようにかけばよろしいのでしょうか? main() { int a; ・・・・ if (■■) { printf("Error!\n"); exit(1); } printf("a = %d\n",a); この if の■■に書くべきことを教えてください。
- ベストアンサー
- C・C++・C#