Функция, возвращающая Int несмотря на другое определение типа возвращаемого значения - PullRequest
2 голосов
/ 19 сентября 2011

Так что я немного запутался здесь. Я работаю над большим проектом, но столкнулся с несколькими проблемами, поэтому я написал небольшой тестовый пример, используя простую структуру:

#include <stdio.h>

typedef struct{
    int property1;
}test;

int main(){
    test testing = getNumber();
    printf("%d",testing.property1);
    return 0;
}

test getNumber(){
    test testing = {2};
    return testing;
}

Все, что я пытаюсь сделать, это прочитать свойство из структуры теста, возвращаемой из getNumber (). Однако компилятор жалуется на следующую ошибку:

test.c (8): ошибка C2440: «инициализация»: невозможно преобразовать из «int» в «тест»

Итак, мой вопрос: почему эта функция пытается вернуть int, несмотря на то, что я указал тип возвращаемого теста? Как это исправить? Я просто слеп к чему-то простому?

Ответы [ 2 ]

5 голосов
/ 19 сентября 2011

Вам не хватает прототипа:

#include <stdio.h>

typedef struct{
    int property1;
}test;

test getNumber(void); // <<< missing prototype

int main(){
    test testing = getNumber();
    printf("%d",testing.property1);
    return 0;
}

test getNumber(void){
    test testing = {2};
    return testing;
}
2 голосов
/ 19 сентября 2011

Сообщение об ошибке здесь немного неоднозначно.Тип возвращаемого значения функции ac по умолчанию int.Компилятор сообщает, что не может выполнить преобразование из int в test.Но на самом деле, это не удалось, потому что он не знал, что такое getNumber().Сообщение об ошибке компилятора должно быть немного яснее, говоря о неопределенном вызове getNumber() или о чем-то в этих строках.

Компилятор C работает по принципу сверху вниз.Что бы ни использовали переменные, вызовы функций должны быть известны ей заранее.Поэтому, когда компилятор видит следующее утверждение -

test testing = getNumber();

, до этого момента он не знает, что такое getNumber().Итак, у вас есть две опции, которые делают компилятор счастливым.

  1. Либо вперёд объявите объявление функции.
  2. Или переместите определение функции выше main().
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...