2014-01-12 3 views
1

Код ниже возвращает предупреждение, я не могу понять, почему, а также не смог найти ответ среди вопросов о том же предупреждающем сообщении. Я благодарю, чтобы получить правильный код и объяснение о предупреждении.Назначение из несовместимого типа указателя при назначении аргумента локальной переменной

Это предупреждение:

ВНИМАНИЕ: назначение от типа несовместим указателя

Код:

#include <stdio.h> 

typedef struct sum { 
    int a,b,c; 
} mytype; 

mytype sum_operation, *ptr;  


mytype sum(sum_operation) { 

    ptr = &sum_operation; 

    (*ptr).a = 1;  
    (*ptr).b = 3;  

    (*ptr).c =(*ptr).b + (*ptr).a ; 

    printf("%d\n",(*ptr).c); 

} 

int main(){ 

    sum(sum_operation); 
    return 0; 

} 
+1

В какой строке указано предупреждение? – bolov

+2

'(* ptr). Любое' может быть выражено намного опрятно, как 'ptr-> whatever'. – glglgl

ответ

3

объявление функции должно быть (вы опустили тип параметра):

mytype sum(mytype sum_operation) { 
3
mytype sum(sum_operation) { 

Где тип sum_operation?

Он может по умолчанию int вот так. (По какой причине см. Комментарий @Gilles и ответ @ AndreyT). Конечно, это приводит к конфликту с

ptr = &sum_operation; 

, который ожидает sum_operation быть типа mytype. Так пишут:

mytype sum(mytype sum_operation) { 

Кроме того, ваша функция не возвращает заявление, хотя он объявлен возвращать mytype.

+0

Это не просто gcc, это наследие от дней до ANSI, которое по-прежнему поддерживается для обратной совместимости. Нет типа = 'int'. – Gilles

+0

@ Gilles Спасибо, я исправлю свой ответ. Не знал этого. – Nabla

+0

@ Gilles: Это не «pre-ANSI». ANSI C89/90 считает этот код законным, так как он поддерживает правило «неявное int». – AnT

2

Ваша sum функция объявлена ​​с старого типа K & R декларации. То есть вы указали один параметр sum_operation без указания его типа. Компилятор pre-C99 принимает это заявление, неявно рассматривая ваш параметр как имеющий тип int. Это то, что приводит к проблеме «несовместимого типа».

Похоже, вы указали свой параметр, чтобы иметь тип mytype. В этом случае вы должны явно сообщить компилятору об этом. Либо использовать современную декларацию функции прототипа стиля с явно указанным типом параметра

mytype sum(mytype sum_operation) 
{ 

или, если вы настаиваете на декларации старого стиля, указать тип параметра между функцией заголовка и первого {

mytype sum(sum_operation) 
mytype sum_operation; 
{ 

Оба стиля по-прежнему легальны в современном C, причем первый из них значительно превосходит последний. Ваше оригинальное объявление является незаконным в современном C, что означает, что может быть хорошей идеей настроить ваш компилятор для правильной фиксации таких ошибок на ранней стадии.

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