Cのプロトタイプ宣言のミスによる素敵な動作
まず,ファイルを二つ用意します.
File1 : test_prototype.c
void prototype_test(char a, short b, float c){
printf("char = %d, short = %d, float = %f \n",a,b,c);
}
File2 : test_main.c
//void prototype_test();
//void prototype_test(double,float,char);
//void prototype_test(int,int,int);
//void prototype(int);
//void prototype_test(char,short,float);
int main(){
prototype_test(-1,-1.,-1);
}
mainのほうのプロトタイプ宣言をいろいろ変えて,動作を確認してみましょう.
素敵なことが起こるかもしれません.
ちなみに,プロトタイプ宣言が無くても,コンパイルは通ります.
- Wallをつけないと警告すらでませんw
まぁ,結果は変なことになるんですが,
その原因は K&R C と ANSI C の上位互換を保持の仕様のため.
K&R C ではプロトタイプ宣言は関数名を引数なしで書く.
しかも,int以下の整数型の引数はintにキャストされ,floatはdoubleにキャストされる.
コンパイラを簡単にするための仕様だったらしい.
このあたりの事情により,ファイル間の変数の受け渡しを行う型が一致せず,へんな動作を起こす.
まー,説明が難しいので本を読んだほうがいいかもしれない.
−−−−
とりあえず解析を試みたんだが,コンパイラがレジスタをつかったりしているためか,動作はよく分からなかった.
とりあえず,その過程である変数のメモリ中身を見るマクロを作成した.
#define MEM_PRINT(c) {int _i;for(_i=0;_i