C言語関係掲示板

過去ログ

No.333.インクルード無しでエラーにならないのは?

[戻る] [ホームページ]
No.2111

コマンドプロンプトでVCのコンパイラを使う際のインクルード
投稿者---まま(2002/07/18 02:30:14)


コマンドプロンプト上でコンパイルをしています。
コンパイラはVCを利用するため、プロンプト上でVCVARS32.BATを起動しています。このようにしてコンパイルすると、stdio.hなどをインクルードしなくても、エラーにならないのですが、VCVARS32.BATが調整しているのでしょうか?

No.2114

Re:コマンドプロンプトでVCのコンパイラを使う際のインクルード
投稿者---B.Smith(2002/07/18 13:00:41)


こんにちは。

>コマンドプロンプト上でコンパイルをしています。
>コンパイラはVCを利用するため、プロンプト上でVCVARS32.BATを起動しています。このようにしてコンパイルすると、stdio.hなどをインクルードしなくても、エラーにな>らないのですが、VCVARS32.BATが調整しているのでしょうか?

LSI-C86やBorland C 5.5は環境設定をファイルとして持っていますが、Microsoftのコンパイラは環境変数を使用しています。VCVARS32.BAT内でコンパイルに必要な環境変数の設定を行っていますので、コンソールウインドウ毎にVCVARS32.BATを実行していれば、コンパイルで(環境に関する)エラーになることはありません。
環境変数に関してはヘルプに載っていますので御覧ください。

Microsoftコンパイラで必要な環境変数は以下の3つです。
  • PATH … cl.exeや、その他コンパイラに必要なファイルを検索するパスを定義する
  • INCLUDE … コンパイラがインクルードヘッダを検索するパスを定義する
  • LIB … リンカがライブラリを検索するパスを定義する

Windows NT系と、それ以外のOSでは環境変数に違いがありますので、VCVARS32.BAT内では、これらの区別も含めて環境変数を設定しています。



No.2121

Re:コマンドプロンプトでVCのコンパイラを使う際のインクルード
投稿者---B.Smith(2002/07/18 16:55:53)


ごめんなさい。質問をよく読んでいませんでした。
No.2115のかずまさんの投稿を御覧ください。



No.2123

ありがとうございます。
投稿者---まま(2002/07/18 17:29:01)


>ありがとうございます。
環境変数のヘルプ、早速参照いたします。

No.2115

Re:コマンドプロンプトでVCのコンパイラを使う際のインクルード
投稿者---かずま(2002/07/18 14:07:49)


> マンドプロンプト上でコンパイルをしています。
> コンパイラは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 は、普通の関数については、引数をレジスタで渡すようなコードを
生成しますが、可変引数の関数については、引数をスタックだけで渡すような
コードを生成します。プロトタイプ宣言がないと、可変引数かどうかわからない
ので、正しくコンパイルされないということです。

No.2122

ありがとうございます。
投稿者---まま(2002/07/18 17:27:24)


ありがとうございます。
VCでもエラーにならないということ、確認いたしました。
が、同じVCのコンパイラなのに、コマンドラインからだと、警告が出ず、VCでは警告が出るのはなぜなのでしょうか?

No.2124

Re:ありがとうございます。
投稿者---かずま(2002/07/18 18:15:20)


> VCでもエラーにならないということ、確認いたしました。
> が、同じVCのコンパイラなのに、コマンドラインからだと、警告が出ず、
> VCでは警告が出るのはなぜなのでしょうか?

統合環境(Visual Studio)なら、プロジェクトの設定で、C/C++タブを選び、
カテゴリを一般にすると、警告レベルが 3 になっていませんか。

コマンドラインから、cl /W3 でコンパイルすると、同じ警告が出るはずです。

警告の出ない gcc でも、gcc -Wall でコンパイルすると、警告が出ます。

No.2127

ありがとうございます。
投稿者---まま(2002/07/18 21:22:10)


ありがとうございます。
よくわかりました。