C ++ без учета возвращаемого типа

0

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

Вот тестовый код, спасибо.

#include <iostream>
#include <vector>
using std::vector;
vector<vector<int> > testReturn(){
    int test = 5;
}
int main(){
    testReturn();
    return 0;
}
  • 0
    Вы должны включить предупреждения / ошибки компилятора.
  • 0
    Какой компилятор принимает этот код?
Показать ещё 1 комментарий
Теги:

4 ответа

1
Лучший ответ

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

  • 0
    (Я верю) Это только неопределено, если вы something = testReturn(); использовать возвращаемое значение (то есть, в вызывающей программе, например, something = testReturn(); ).
1

Это неправильный код, создающий неопределенное поведение.

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

  • 0
    Это не ошибка в компиляторе. Стандарты позволяют компиляторам иметь дело с неопределенным поведением любым удобным для них способом, в том числе давать и не давать диагностические сообщения.
  • 0
    Со стандартной стороны вы правы, но в большинстве случаев VS показывает ошибку. Так что, по крайней мере, для VS, это ошибка
1

Я не даю функции возвращаемое значение, но почему этот код может проходить через компилятор?

Предоставление return значения является необязательным в C. Это правило "перенесено" на C++, а также добавляет длинный список неопределенных действий (например, ситуации, когда недопустимые программы разрешены для компиляции). К кредиту C++ компиляторы предупреждают вас о подобных ситуациях в довольно недвусмысленных выражениях.

И мне интересно, если я не даю явный тип возвращаемого значения для одной функции, как показано ниже, что компилятор будет генерировать код?

Компилятор не будет генерировать код для обработки возвращаемого значения. Независимо от того, какое произвольное состояние регистров ЦП и память в закрывающей скобке, то состояние, которое будет "возвращено". Попытка интерпретировать произвольные значения в качестве возвращаемого значения - это то, что приведет к сбою.

  • 0
    И, в частности, уничтожение возвращаемого объекта в конце main , вероятно, приведет к неприятным последствиям.
0

Код не компилируется, так как возвращаемый тип testRunner является вектором вектора ints.

Так верни его!

  • 0
    Он компилируется с использованием gcc ... странно, но верно ...
  • 0
    Как ни странно, Visual Studio также не обнаруживает такие проблемы время от времени, что приводит к сбоям во время выполнения.
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню