e94.c

初期値の型が合わない


/********************************/ /* 問題例1:返却値無しの関数 */ /********************************/ void VoidFunc() { return ; } struct t_crtsk1 { int (*start)() ; }R1[] = { ★ VoidFunc, ■ (void *)VoidFunc, } ; void関数を intを返す関数を指すポインタで指しています。 ■ void *は、 データは指せますが関数は指せません。
/********************************/ /* 問題例2:Intを返す関数 */ /* 引数はCHAR */ /********************************/ int CharArg(char arg) { return 0 ; } struct t_crtsk2 { int (*start)() ; }R2[] = { ★ CharArg, } ; ★ 『intを返す引数がcharの関数』を 『intを返す関数』を指すポインタで指しています。
/********************************/ /* 修正例: */ /********************************/

☆引数に処理速度の遅いCHAR/SHORTを極力使用しない。

int IntFunc(int dmy) { return 0 ; }

☆適切な関数ポインタを使用する。

struct t_crtsk { int (* intFp) () ; int (* charFp)(char) ; void (*voidFp) () ; } R3[] = { IntFunc , CharArg , VoidFunc , };
解説 関数呼び側の、INTに満たない引数の拡張規則と、 関数定義側の、INTに満たない引数の拡張規則が違う事を警告しています。 警告を消すには、 案1. 関数の、引数がINTでもSHORTでも良いならば、INTにする。 案2. INTに満たない引数の関数の、 関数宣言と関数定義を、両方ANSI型にするか、 関数宣言と関数定義を、両方K&R型にする。 正確な説明は、 C-FAQ 11.3 か、 北野欣一 スティーブンサミット著 Cプログラミング FAQ Cプログラミングのよく尋ねられる質問 トッパン 2800円 を参照して下さい。