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