他の人が指摘しているように、問題は、間違ったタイプの引数を に渡していることですuserComFunction
。しかし、本当の問題は、コンパイラがそれを伝えていないことです。
C90 (これは 2 つの標準より前のことです) の時点で、目に見える宣言なしで関数を呼び出すことは合法であり、コンパイラは関数が実際にどのように見えるかについて (しばしば正しくない) 仮定を行います。コンパイラが への呼び出しを認識した場合、userComFunction
の宣言または定義を認識していないためuserComFunction
、エラーを診断できません。
C99 の時点では、可視宣言なしで関数を呼び出すことは制約違反です。つまり、コンパイラは少なくともそれについて警告する必要があります。C99 では「暗黙のint
」ルールも削除されたため、関数宣言で戻り値の型を省略できなくなりました。は戻り値の型 ( not !) でmain
宣言する必要があり、 は何も返さないため、 にする必要があります。int
void
userComFunction
void
userComFunction
の完全な定義を の定義の上に移動するかmain
、定義をそのままにして「前方」宣言を追加することができます。
void userComFunction(struct userCom *return_type);
int main(void) {
/* ... */
}
void userComFunction(struct userCom *return_type) {
/* ... */
}
これを行うと、コンパイラは次の呼び出しを通知する必要があります。
userComFunction(com);
間違っています。(修正は に変更com
すること&com
です。)
より多くの警告を有効にするには、gcc のコマンドライン オプションも使用する必要があります。例えば:
gcc -std=c99 -pedantic -Wall -Wextra
-std=c99
ISO C99 ルールを適用するように指示します。これらのルールを実際-pedantic
に施行するように言います。追加の警告を有効にします。-Wall
-Wextra