2012-02-16 4 views
0

Можно создать дубликат:
Why can you return from a non-void function without returning a value without producing a compiler error?Почему этот компилятор C++?

Почему gcc 4.6.1 собрать следующую функцию без оператора возврата?

uint32_t& siof_solution() { 
    static uint32_t example = (uint32_t) 7; // Doesn't really matter 
    // return example; 
} 

Он возвращает 1. Я видел это.

+2

Эй, это дает вам предупреждение, этого недостаточно? Был переключатель, чтобы остановить компиляцию при предупреждении ... – Griwes

+0

Я видел аналогичные случаи с компилятором Visual C++. Если функция была объявлена ​​с возвращаемым значением, я забыл поставить оператор return и как-то скомпилировал его и вернул значение! В моем случае возвращаемым значением был мусор, который был интерпретирован как истинный. Не знаю, почему. – Nerdtron

+2

** Всегда ** компиляция с включенными предупреждениями. Не отправляйте сообщения, пока вы не попытались скомпилировать все предупреждения. –

ответ

9

Функции C++ не обязаны возвращать значение, даже если говорят, что они делают. Если они этого не делают, результатом является неопределенное поведение. В вашем случае, через Sheer Dumb Luck, код кажется неработоспособным, но он не переносимый и небезопасный. Это может привести к сбою, вернуть указатель мусора, вызвать ошибку отладки и т. Д.

Я думаю, что причина этого решения в основном связана с обратной совместимостью с C, хотя я не уверен.

Надеюсь, это поможет!

+0

«Sheer Dumb Luck» - ключевая фраза здесь. – peterchen

0

Проверка возврата как-то отключена. Я даже не помню, требуется ли это на C++ вообще. Возвращаемое значение в вашем случае - мусор памяти.

Смежные вопросы