2012-04-21 2 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*) либо изменить объявление или изменить аргументы, например:

void display(const char *s, const char *t, int n); 
int main() 
{ 
    // snip 
    display ("Basic", "Basic", 550); 
    //snap 
} 

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

Nitty pick: В C элементы символьных строковых литералов имеют тип 'char', а не' const char', как в C++. –

+0

@ DanielFischer - не могли бы вы уточнить? вы имеете в виду 'char * a =" abc "' лучше, чем 'const char * a =" abc "' в C? – MByD

+0

Я имею в виду, что в C, '" Basic "' имеет тип 'char [6]', а не 'const char [6]'. Поскольку попытка изменить строковые литералы - это UB, лучше назначить их 'const char *', но это не тот тип, который у них имеется в спецификации языка. –