2013-12-26 5 views
0

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

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

#include <iostream> 
#include <vector> 
using std::vector; 
vector<vector<int> > testReturn(){ 
    int test = 5; 
} 
int main(){ 
    testReturn(); 
    return 0; 
} 
+0

Необходимо включить предупреждения и ошибки компилятора. –

+0

Какой компилятор принимает этот код? –

+0

@DavidHeffernan, согласно [ideone] (http://ideone.com/AeGoaL), gcc ... – StoryTeller

ответ

1

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

+0

(я считаю) Это только неопределенный, если вы пытаетесь использовать возвращаемое значение (то есть в вызывающем, например, 'something = testReturn();'). – RastaJedi

0

код не компилируется как тип возвращаемого testRunner вектор вектора целых чисел.

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

+0

Он компилируется с использованием gcc ... странно, но верно ... – StoryTeller

+0

Как ни странно, Visual Studio также время от времени не обнаруживает таких проблем, что приводит к сбоям во время выполнения. – DarkWanderer

+0

@DarkWanderer, VS, что-то вроде этого не так странно: P – StoryTeller

1

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

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

+0

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

+0

На стандартной стороне вы правы, но в большинстве случаев VS показывает ошибку. Итак, по крайней мере для VS, это ошибка – DarkWanderer

1

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

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

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

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

+0

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