|
> マンドプロンプト上でコンパイルをしています。
> コンパイラはVCを利用するため、プロンプト上でVCVARS32.BATを起動しています。
> このようにしてコンパイルすると、stdio.hなどをインクルードしなくても、
> エラーにならないのですが、VCVARS32.BATが調整しているのでしょうか?
stdio.h をインクルードしなくても、エラーにならないのは、C
の規格に
よるもので、VCVARS32.BAT は関係ありません。VCVARS32.BAT は、コマンド
ラインから VC++ のコンパイラを使うために必要なだけのものです。
例えば、次のプログラムを VC++, Borland C++, gcc, LSI C-86 でコンパイル
してもエラーになりません。
int main() { puts("puts"); printf("printf\n"); return 0; }
C では、宣言なしに関数呼び出しがあると、int を返す関数だと解釈して
コンパイルを行います。「宣言がない」という「警告」を出すコンパイラも
ありますが、「エラー」ではありません。
ただし、引数のプロトタイプ宣言がないため、実行時に不具合が生じることが
あります。printf のような引数の個数が可変な関数は、プロトタイプ宣言がないと、
実行結果は未定義であると規格にあって、実際、LSI C-86 では、この printf は
出力されません。
LSI C-86 は、普通の関数については、引数をレジスタで渡すようなコードを
生成しますが、可変引数の関数については、引数をスタックだけで渡すような
コードを生成します。プロトタイプ宣言がないと、可変引数かどうかわからない
ので、正しくコンパイルされないということです。
|