bool SomeFunction()
{
}
Я не могу запустить Borland C ++ на моей машине, но мне нужно конвертировать из C ++ в VB, поэтому мне нужна помощь с этой функцией.
Функция утверждает, что возвращает bool
но это ничего не возвращает. Это должно привести к предупреждению компилятора. если ты используйте это, чтобы назначить что-то вызовите функцию, результатом будет неопределенное поведение:
bool b = SomeFunction(); // UB, SomeFunction is failing to return.
SomeFunction(); // still undefined behaviour
Только main()
разрешено не возвращать явно, в этом случае он неявно возвращает 0
,
Посмотреть здесь:
§6.6.3 / 2:
Выпуск из конца функции эквивалентен возврату без значения; это приводит к неопределенному поведению в функции, возвращающей значение.
Я скомпилировал следующий код на Borland XE2:
bool SomeFunction()
{
}
int main()
{
bool x = SomeFunction();
// ...
}
SomeFunction()
переведено на следующий код ассемблера x86:
push ebp
mov ebp,esp
pop ebp
ret
Назначение в main()
переведено на:
call SomeFunction()
mov [ebp-$31],al
где [ebp-$31]
это место x
, Это означает, что содержимое реестра al
в конечном итоге в bool x
, Если al
было 0, x
будет ложным, в противном случае x
будет правдой. В моей системе это всегда было так, но это зависит от контекста. Также вы можете получить разные результаты для отладки и выпуска.
Вывод, конечно, х не определен. Данный код немного похож на написание
bool x;
if (x)
{
// ...
}
Я склонен думать, что определение SomeFunction()
должен вызывать не только предупреждение компилятора, но и ошибку. Visual C ++ делает так, я не знаю о других компиляторах.
Должно return true;
или же return false;
bool SomeFunction()
{
return true;
// or
return false;
}
Если ваш компилятор не имеет встроенного bool, вы можете сделать это:
typedef int bool;
#define true 1
#define false 0
int main(void)
{
bool answer;
answer = true;
while(true)
{
}
return 0;
}