0

主に 2 種類のコンパイル警告があります。

1. 関数の暗黙の宣言

in a.cchar *foo(char *ptr1, char *ptr2)in 、いくつかの関数は宣言なしでb.cこの関数を使用し、コンパイラは関数の戻り値を整数として扱うようであり、関数宣言よりも少ないまたは多い変数を渡すことができることがわかりましたfoofoofoo

2. 列挙型と別の型の混在

私のターゲットチップはARM11で、これら2種類のコンパイル警告を解決しなくても、プログラムは問題なく実行できるようですが、これらの背後には何らかのリスクがあるに違いないと思います. これら2種類のコンパイル警告が予期しない問題を引き起こす可能性があるという良い例を誰か教えてもらえますか?

一方、これら 2 つの警告に潜在的なリスクがある場合、なぜ C コンパイラはこれらの種類の警告の発生を許可し、直接エラーに設定しないのでしょうか? 裏話は?

4

2 に答える 2

2

暗黙の宣言。たとえば、 function: がありますがfloat foo(float a)、これは呼び出し時に宣言されていません。暗黙のルールは、次のシグネチャで自動宣言を作成します: int foo(double)(渡された引数が float の場合)。したがって、渡す値は double に変換されますがfoofloat. 戻り値を呼び出すコードも同様ですが、戻り値intが返されfloatます。値は完全に混乱します。

enum と他の type が混在しています。列挙型には、取り得る値のリストがあります。数値を割り当てようとすると、リストされた値のいずれでもない可能性があります。後でコードが指定された範囲のみを期待し、他に何もないと想定すると、誤動作する可能性があります。

于 2014-10-29T07:57:02.023 に答える
0

簡単な例:

ファイル: warn.c

#include <stdio.h>

double foo(double x)
{
  return myid(x);
}

int
main (void)
{
  double x = 1.0;
  fprintf (stderr, "%lg == %lg\n", x, foo (x));
  return 0;
}

ファイル: foo.c

double
myid (double x)
{
  return x;
}

コンパイルして実行します。

$ gcc warn.c foo.c -Wall
warn.c: In function ‘foo’:
warn.c:5: warning: implicit declaration of function ‘myfabs’
$ ./a.out 
1 == 0

古い C 標準 (C90) にはこの奇妙な "default int" ルールがあり、互換性のために最新のコンパイラでもサポートされています。

于 2014-10-29T08:05:17.447 に答える