Раздел $ 3.6.1 / 1 стандарта C ++ гласит:
Программа должна содержать глобальный функция под названием main , которая является назначенное начало программы.
Теперь рассмотрим этот код,
int square(int i) { return i*i; }
int user_main()
{
for ( int i = 0 ; i < 10 ; ++i )
std::cout << square(i) << endl;
return 0;
}
int main_ret= user_main();
int main()
{
return main_ret;
}
Этот пример кода выполняет то, что я намереваюсь сделать, то есть печатает квадрат целых чисел от 0 до 9, перед , входящего в функцию main ()
, которая должна быть "стартом" программы.
Я также скомпилировал ее с опцией -pedantic
, GCC 4.5.0 . Он не дает ни ошибок, ни даже предупреждений!
Итак, мой вопрос:
Действительно ли этот код соответствует стандарту?
Если он соответствует стандарту, то не отменяет ли он то, что говорится в стандарте? main ()
- это не запуск этой программы! user_main ()
выполняется до main ()
.
Я понимаю, что для инициализации глобальной переменной main_ret
, сначала выполняется use_main ()
, но это совсем другое дело; дело в том, что он делает недействительным цитируемый оператор $ 3.6.1 / 1 из Стандарта, поскольку main ()
НЕ является запуском программы; на самом деле это конец этой программы!
РЕДАКТИРОВАТЬ:
Это сводится к определению слова «начало» фраза «запуск программы» . Итак, как именно вы это определяете?