2012-04-21 10 views
1

私のコードは、私はVisual Studioでそれを実行しようとしています。Cで再定義エラーが発生するのはなぜですか?

#include <stdio.h> 
#include <conio.h> 
int main() 
{ 
    //int i; 
    //char j = 'g',k= 'c'; 
    struct book 
    { 
     char name[10]; 
     char author[10]; 
     int callno; 
    }; 
    struct book b1 = {"Basic", "there", 550}; 
    display ("Basic", "Basic", 550); 
    printf("Press any key to coninute.."); 
    getch(); 
    return 0; 
} 

void display(char *s, char *t, int n) 
{ 
    printf("%s %s %d \n", s, t, n); 
} 

機能の開始ブレースが入力された行の再定義のエラーを示します。

答えて

5

宣言する前にdisplayを呼び出すと、コンパイラは戻り値の型がintとみなしますが、戻り値の型はvoidです。

それを使用する前に、関数を宣言:

void display(char *s, char *t, int n); 
int main() { 
    // ... 

また、あなたがchar*を受けるとしてそれを宣言することを、注意したが、それに文字列リテラルを渡す(const char*)のいずれか例えば、宣言を変更、または引数を変更します。

+0

Nitty pick:Cでは、文字列リテラルの要素は、C++のように 'char'型で、' const char'型ではありません。 –

+0

@ダニエルフィッシャー - あなたは精緻化できますか? 'char * a =" abc "'が 'const char * a =" abc "'よりも優れているのでしょうか? – MByD

+0

C言語では、 "Basic"は 'const char [6]'ではなく 'char [6]'型を持っています。文字列リテラルを変更しようとするのはUBなので、 'const char *'に代入する方が良いですが、言語仕様ではそれらの型ではありません。 –

関連する問題