Const возвращаемых типов в C - PullRequest
4 голосов
/ 22 августа 2010

Я читал несколько примеров кода, и они возвращали const int. Когда я попытался скомпилировать код примеров, я получил ошибки, касающиеся конфликтующих типов возвращаемых данных. Поэтому я начал искать, думая, что проблема в const (когда я его удалял, код работал нормально, не только компилировался, но и работал как ожидалось). Но мне никогда не удавалось найти информацию, относящуюся к константному типу возврата (я это сделал для структур / параметров / и т. Д., Но не возвращаемых типов) Поэтому я попытался написать кусок кода, чтобы просто показать, что может сделать const. Я придумал это:

#include <stdio.h>

int main() {
    printf("%i", method());
}

const int method() {
    return 5;
}

И когда я скомпилирую это, я получаю:

$ gcc first.c 
first.c:7: error: conflicting types for ‘method’
first.c:4: note: previous implicit declaration of ‘method’ was here

Однако всякий раз, когда я удаляю const, он, как и ожидалось, просто печатает 5, а жизнь продолжается. Итак, может кто-нибудь сказать мне, что const должен означать при использовании в качестве типа возврата. Спасибо.

Ответы [ 5 ]

21 голосов
/ 22 августа 2010

const не имеет смысла для возвращаемых значений, потому что возвращаемые значения rvalues ​​ в любом случае и не могут быть изменены.Ошибка, которую вы получаете, заключается в том, что вы используете функцию до того, как она была объявлена, поэтому предполагается, что она неявно возвращает int, а не const int, но тогда, когда метод фактически определен, возвращаемый тип не совпадаетисходное предположение.Вы получите точно такую ​​же ошибку, если, скажем, вернуть double вместо int.

Например:

#include <stdio.h>

int main() {
    printf("%i", method());
}

double method() {
    return 5;
}

генерирует:

$ gcc -std=c99 -Wall -Wextra -pedantic impl.c
impl.c: In function ‘main’:
impl.c:4: warning: implicit declaration of function ‘method’
impl.c: At top level:
impl.c:7: error: conflicting types for ‘method’
impl.c:4: note: previous implicit declaration of ‘method’ was here

Посмотрите, как полезно повысить уровень предупреждения!

5 голосов
/ 22 августа 2010

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

Oh, и относительно CONST-ness: это означает, что значение функции будет таким же, если вы вызовете ее снова с помощьюте же параметры, и что не должно быть (важных) побочных эффектов.Это полезно для оптимизации, а также делает документальное подтверждение того, что компилятор может применять параметры.Функция обещает не изменять константу, и компилятор может помочь предотвратить ее.

4 голосов
/ 22 августа 2010

Код, который вы разместили, должен дать вам неопределенный идентификатор: method как минимум.Вам нужно объявление в области видимости, прежде чем вы сможете вызвать функцию.Лучшее использование:

#include <stdio.h>

const int method() {
    return 5;
}

int main() {
    printf("%i", method());
}

Определение также является декларацией.Итак, это должно исправить вашу ошибку.

4 голосов
/ 22 августа 2010

Добавление прототипа метода () перед его вызовом исправит ошибку.

const int method();
int main() {
    printf("%i", method());
}

Line 7: error: conflicting types for 'method'

Эта ошибка говорит нам о том, что method() был создан компилятором (потому что онне найдено) с типом возврата, отличным от const int (вероятно, int).

Line 4: error: previous implicit declaration of 'method' was here

Эта другая ошибка говорит нам о том, что на самом деле компилятор создал свою собственную версию method.

2 голосов
/ 22 августа 2010

main видит использование method() без прототипа, поэтому предполагает, что возвращает int. Затем вы объявляете это возвращением const int. Переместите объявление method() перед main или поместите прототип перед main.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...