Любой статус выхода без явного использования возврата / выхода - PullRequest
1 голос
/ 24 февраля 2010

Это фактически вызывает у меня проблемы довольно давно. Вопрос такой: Как установить состояние выхода программы на любое значение без явного использования return / exit в gcc / g ++? Давайте рассмотрим этот кусок кода: (принимает входные данные из стандартного ввода и печати это в стандартный вывод, пока не встретится нулевой вход 0)

#include <stdio.h>

int main() {
  int n;
  while(scanf("%d",&n) && n>0 )
    printf("%d\n",n);
}

В моей системе (которая Windows + MINGW ) возвращается 1, Как сделать это вернуть 0 или что-то еще неявно без явного использования выход / возврат?

РЕДАКТИРОВАТЬ:

Я немного изменил код:

int f(int n) { 
  return (n>0);
}

int main(){
  int n;
  while(scanf("%d",&n)&&f(n))
    printf("%d\n",n);
}

Сейчас он возвращает 0 неявно, но я не смог сделать из этого никакого твердого заключения.

Ответы [ 3 ]

2 голосов
/ 24 февраля 2010

В C ++ и в C99 выход из main без выполнения exit () или return должен быть эквивалентен возврату 0 (см. 5.1.2.2.3 для C, 3.6.1 / 5 для C ++), C89 оставил это значение неопределенным, если я вспомню правильно.

2 голосов
/ 24 февраля 2010

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

(Это, вероятно, связано со значением, оставленным в регистре EAX, как уже упоминалось в комментариях.)

Лучшее, что я могу придумать:

static int program_exit_value;

void setExitValue(int value)
{
    program_exit_value = value;
}

int main(void)
{
    ...

    return program_exit_value;
}

Который использует оператор return, но имеет то преимущество, что он совместим с ANSI.

0 голосов
/ 24 февраля 2010

Дело в том, что ваша программа в конечном итоге завершит работу - например, среда выполнения вызовет ExitProcess() в Windows или эквивалентную функцию в другой ОС. Примитив, используемый для завершения программы, установит код ошибки (состояние выхода), который переопределит код, ранее установленный вами напрямую.

Возможно, есть некоторые реализации среды выполнения C ++, которые разрешают то, что вы хотите, но в целом поведение такое, как я описал выше.

...