1. ホーム
  2. c

[解決済み] gccでcプログラムをコンパイルすると、型の衝突エラーが発生する。

2022-02-17 05:53:35

質問

以下のプログラムをgccでコンパイルしてみました。

0 #include  <stdio.h>
1 
2 main ()
3
4 {    
5  char my_string[] = "hello there";      
6
7  my_print (my_string);    
8  my_print2 (my_string);    
9}
10   
11 void my_print (char *string)
12 {    
13  printf ("The string is %s\n", string);    
14 }
15        
16 void my_print2 (char *string)
17 {
18  char *string2;    
19  int size, i;   
20
21  size = strlen (string);    
22  string2 = (char *) malloc (size + 1);
23
24  for (i = 0; i < size; i++)    
25    string2[size - i] = string[i];
26
27   string2[size+1] = '\0';    
28   printf ("The string printed backward is %s\n", string2);    
29 }

しかし、これは失敗し、コンパイラは次のようなエラーログを出力します。

  1. greeting.c: 11: error:conflicting types for 'my_print'.
  2. greeting.c: 7: error: 'my_print' の前の暗黙の宣言はここでした。
  3. greeting.c: 16: error:conflicting types for 'my_print2'.
  4. greeting.c:8: erroro:previous implicit declaration of 'my_print2' was there.

そして、my_printとmy_print2関数をmain関数の前に移動させると、すべてがうまくいきます。 そこで、なぜこの問題が起こるのか、どなたか説明していただけませんか? ありがとうございます。

解決方法は?

関数を宣言せず、呼び出されて初めて表示される場合、その関数は自動的に int を宣言していないことになります。

void my_print (char *);
void my_print2 (char *);

というプロトタイプを持つ関数が存在すると仮定します。 int my_print2 (char *);int my_print2 (char *); というエラーが発生し、戻り値の型を除いて同じプロトタイプを持つ関数を2つ持つことができません。 conflicting types .

Brianが提案したように、この2つのメソッドをmainの前に宣言してください。