私は K & R から C を勉強していましたが、本書のパート 4.4 でスコープ規則について言及していて混乱しました。先に進む前に、作業中のソース ファイルを投稿させてください。
#include <stdio.h>
void first(void);
int main(void) {
printf("In main.\n");
first();
second();
return 0;
}
void first(void) {
printf("In first.\n");
}
void second(void) {
printf("In second.\n");
}
さて、私が想像以上に愚かでない限り、この本は、関数プロトタイプ (関数の定義と同じファイル内) がスコープ上の理由で存在するという考えを与えてくれました。つまり、コンパイルされたファイルの先頭で関数を宣言して、ソースファイルの残りの部分に「オブジェクト」の存在を事前に通知できるようにするために存在します。
上記のコードに関する私の問題はGCC version 4.7.1
、上記のファイルで作業している Arch Linux 仮想マシンでコンパイルできず、次のエラーが発生することです: conflicting types for second
.
ただし、GCC バージョン 4.6.3を搭載したUbuntu 12.04を搭載した物理マシンでまったく同じコードを実行すると、問題なくコンパイルされます。
私の質問は:これはコンパイラの機能ですか? そうでない場合、 の関数プロトタイプがないためsecond
、 (正しく理解していれば)の存在main
を知ることができないはずなので、まったくコンパイルされないことに驚いています。second