#define _VA_LIST_のようにマクロ名のあと処理が書かれていない やつは一体何?

C言語関連28閲覧

ベストアンサー

1

1人がナイス!しています

#ifndef __STDIO__ // __STDIO__を宣言していなければ #define __STDIO__ // 宣言しておき・・・ __cdecl _printf(const*, ...); // 同時にprintfも宣言する #endif これに関してですが __STDIO__ ==#include <stdio.h> #include<stdio.h>と宣言することは __STDIO__を宣言することとイコールなんでしょうか?

ThanksImg質問者からのお礼コメント

ありがとうございました。

お礼日時:2020/4/6 14:14

その他の回答(3件)

0

ソースコードの中で #define AAA とすると、そこを読み込んだプリプロセッサは 以降#undefされるか、コード終端に達するまでコード中の AAAというシンボルを実質削除したものをコンパイラに渡します。 例えば #define AAA AAA int AAA main(AAA void){ ____return AAA 0; } これがエラー無く処理されます。 (プリプロセッサへの指令なのでコンパイラが処理する 前のソースコードに対して操作が行われます。) (このような無意味な使い方は普通しないと思います) 一般的な(文字列置換)マクロと代わりがありません。 条件コンパイルのシンボル(識別子)として使うのは 恐らく慣習です。 本来的な目的である文字列置換としては使われているとは 思えない形式的マクロを使うのが慣習になっているわけです。 個人的経験に照らし合わせても、条件コンパイルのシンボ ルが形式的なマクロでなく、本文でも使用される実体性の ある文字列置換とかマクロ関数となっているのをみると多分 少し違和感というか読みにくさを感じると思います。

0

#include <stdio.h> #define INPUT #define OUTPUT static void func (int INPUT a, int OUTPUT *b) { *b = a ; } int main(void) { int a = 1, b ; func (a, &b) ; return 0 ; } というようなコードがあったとすると、 置換により、仮引数のINPUT、OUTPUTは削除されます。 つまり後ろの方が省略されている場合は"無"に置換されるという感じです。 でも人間にはどの仮引数が関数にとって入力で出力なのかわかりやすくなります。

#define マクロ名 処理 の処理を書かなければ省略したとみなされ1になるとか どっかに書いてあった気がしますが 1ではなくて 無 として解釈されるんですか?

0

#include <stdio.h> int main(void) { #define A #ifdef A printf("A\n"); #else printf("B\n"); #endif #undef A #ifdef A printf("C\n"); #else printf("D\n"); #endif return 0; }

この返信は削除されました