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円
を参照して下さい。