Почему функция, которая имеет тип возвращаемого значения, но ничего не возвращает, не завершает компиляцию? - PullRequest
0 голосов
/ 22 апреля 2020

Рассмотрим следующий пример, скомпилированный с g ++ 5.4 (только):

#include <iostream>

int foo()
{
    std::cout << "foo" << std::endl;
}

int main()
{
    std::cout << foo();
    return 0;
}

foo() не имеет оператора return, код компилируется, и функция возвращает неизвестное значение, то же самое произойдет, когда возвращаемый тип является указателем - что может вызвать ошибку сегментации.

Почему при компиляции такой функции нет ошибок / предупреждений?

Это из-за стандарта C ++ или проблемы с его реализацией?

Ответы [ 3 ]

4 голосов
/ 22 апреля 2020

Определение языка говорит, что это приводит к неопределенному поведению. Это потому, что иногда это невозможно диагностировать. Компиляторы, которые предупреждают вас об этом, иногда ошибаются. Я добавил ненужный оператор возврата, чтобы заставить один компилятор замолчать, но чтобы другой жаловался на этот оператор возврата как «недоступный код»

2 голосов
/ 22 апреля 2020

Почему нет ошибки ... при компиляции такой функции?

Потому что программа правильно сформирована. Компиляторы необходимы для успешной компиляции всех правильно сформированных программ.

Почему при компиляции такой функции нет ... предупреждения?

Стандарт не требует предупреждения. Старые версии G CC предупреждают об ошибках, подобных этой, только если вы попросите компилятор сделать это. G CC 8 включил это конкретное предупреждение по умолчанию.

и функция вернет неизвестное значение

Не совсем. Поведение программы не определено, если выполнение достигает конца функции без void без возврата, так что это может произойти или не произойти.

Обратите внимание, что функция на самом деле будет иметь хорошо определенное поведение в случае, если Оператор вставки потока случайно выбросил или завершил работу программы. Мы знаем, что вставка потока не гарантирует, что она выбрасывает или завершает работу программы, и что это на самом деле было бы довольно удивительно. Но компилятор не может сделать такого рода обобщения.

0 голосов
/ 22 апреля 2020

Я использую g ++ 9.3.0, поэтому не могу много рассказать о g ++ 5.4

В старых версиях, если у вас есть программа на C ++, в которой отсутствует оператор return из функции, которая должна возвращать значение, g ++ с радостью скомпилирует его без ошибок (или даже с предупреждением, если не используются -Wreturn-type или -Wall или -Werror = return-type). Попытка использовать возвращаемое значение из функции, скорее всего, вызовет ошибку сегментации.

Если вы хотите такое поведение, используйте -Werror = return-type

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