src1.c の内容は次のとおりです。
#include <stdio.h>
extern int w;
//int go(char); // no need to declare here. WHY????
main(){
char a='f';
go(a);
printf("%d\n", w);
}
src2.c の内容は次のとおりです。
#include <stdio.h>
int w = 99;
int go(char t){
printf("%c\n%d\n",t,sizeof(t));
}
Linuxでコンパイルした後、ファイルでgo
関数を宣言することが必須ではないのはなぜですか?src1.c
cc src1.c src2.c;
コンパイラは、宣言が不要になるように、ファイルgo
からの関数の定義をメイン関数のコードの上に置きますか?src2.c
私はこのようにします:
#include <stdio.h>
int go(char); // need to declare here, because if not, arguments of go will be promoted to intS and they would conflict with char parameters defined in go. Error is droped!
main(){
char a='f';
go(a);
}
int go(char t){
printf("%c\n%d\n",t,sizeof(t));
}
したがって、プロトタイプがない場合に引数の数とタイプを渡すことが可能であると言う人は誰でも間違っています。この場合、それらは s に昇格int
されますが、定義で指定されたものと一致する必要があります。
いくつかのテストを行ったところ、エラーなしでコンパイルしても正しく動作しないことがわかりました。
ソース1:
#include <stdio.h>
int go(int t){
printf("%d\n%d\n",t,sizeof(t));
}
sr2.c:
#include <stdio.h>
int go(int); //if I omit this prototype, program outputs 1 which is far from correct answer :)
main(){
double b=33453.834;
go(b);
}
したがって、最終的に答えは未定義の動作になる可能性があります。
ありがとうマキシム・スクリディン