2013-06-19 5 views
1

У меня есть следующая ошибка во время компиляции. Я знаю, что это звучит неправильно, но то, что пытается передать компилятор точного сообщения: ошибка: конфликтующие типы для 'fun' ошибка: предыдущая декаляция весело было здесь:Ошибка определения функции функции стиля K & R

int main() 
{ 
    extern int fun(float); 
    int a; 
    a=fun(3.14F); 
    printf("%d\n",a); 
    return 0; 
} 

int fun(aa) 
float aa; 
{ 
    return((int) aa); 
} 
+2

Что происходит со старомодным определением функции? –

ответ

2

K & объявление функций R-стиль не совсем такой же, как современный стилем. В частности, произошли промо-акции по умолчанию, что делает ваш параметр float не совсем законным. У вас есть два варианта, чтобы исправить вашу проблему:

  1. Изменить fun принять double параметр вместо float.

  2. Изменить определение fun для определения функции стандартного C-стиля:

    int fun(float aa) 
    { 
        return aa; 
    } 
    

    Я также удалил ненужные CAST & скобки.

Как и в сторону, если вы новичок, вы можете найти clang полезно - это иногда дает гораздо лучшие сообщения об ошибках. Например, для вашей программы:

example.c:13:7: warning: promoted type 'double' of K&R function parameter is not 
     compatible with the parameter type 'float' declared in a previous 
     prototype [-Wknr-promoted-parameter] 
float aa; 
    ^
example.c:5:25: note: previous declaration is here 
    extern int fun(float); 
         ^
+1

+1 Рекомендуем проверить код с помощью clang. – Aloys

+0

Третий вариант, если по какой-то причине вы настаиваете на использовании определения старого стиля, заключается в том, чтобы правильно объявлять 'fun' внутри' main', меняя 'extern int fun (float);' на 'extern int fun();' , Или просто отпустите декларацию 'extern' и переместите определение' fun' перед 'main'. –

Смежные вопросы