Два вопроса на главном - PullRequest
       18

Два вопроса на главном

3 голосов
/ 08 сентября 2010

A. Допустима ли следующая попытка определить точку входа 'main' автономной программы на C ++?

namespace{
 extern int main(){return 0;}
}

Насколько я понимаю, он удовлетворяет всем критериям "main" в стандарте C ++ (внешняя связь, доступная в глобальном пространстве имен из-за неявной директивы using).

Так что, эта программа плохо сформирована и почему? Любая ссылка на стандарт?

B. Я прошел через обсуждения на EXIT_FAILURE и EXIT_SUCCESS, но не смог сделать вывод, если EXIT_SUCCESS всегда должен быть 0. Это потому, что в соответствии со стандартом, опуская оператор возврата в 'main', эквивалентно возвращению 0. Поэтому я думаю, EXIT_SUCCESS всегда должен быть 0.

$ 18,3 - «Если статус равен нулю или EXIT_SUCCESS, возвращается определяемая реализацией форма успешного завершения статуса.»

Ответы [ 3 ]

2 голосов
/ 08 сентября 2010

Здесь namespace { } - это анонимное пространство имен - идея заключается в том, что оттуда ничего не должно уходить в глобальное пространство имен - на практике все должно начинаться с префикса с тем, что не будет конфликтовать с другими единицами перевода. Вы сделали это extern, но не extern "C", поэтому специальное правило о том, что main не будет искажен, не защитит его, и символ не будет удовлетворять требованиям связывания. В любом случае, поместить что-то внешнее в анонимное пространство имен - это просто запутанное мышление. Вы постоянно выходите из своего пути, чтобы увидеть, как вы можете превратить Стандарт в странные искажения :-). Любопытно - есть ли причина? Вы заинтересованы в этом академически, или в реализации компилятора или набора тестов для компилятора или чего-то еще?

Вы добавили обсуждение EXIT_SUCCESS и EXIT_FAILURE в свой вопрос. Ключевым моментом здесь является то, что вы можете использовать их из main или exit () и знать, что они будут работать в любой операционной системе. Для возврата 0 не проблема, используете ли вы EXIT_SUCCESS, 0 или позволяете main «провалиться». ОС может на самом деле возвращать или не возвращать 0 в операционную систему ... может случиться так, что среда выполнения сопоставит это с каким-то другим значением, которое означает «успех» в этой ОС. Но для сбоя - если вы возвращаете произвольное значение, отличное от 0, оно может обойти это отображение и либо указать что-то отличное от простого сбоя, либо случайно совпадать со значением успеха. Значения также могут обрабатываться по-разному в разных операционных системах: многие (например, Linux) будут отбрасывать возвращаемое значение для всех, кроме 8 наименее значимых битов, так что возвращаемое значение 256 эквивалентно возвращаемому значению 0. Поэтому не стоит угадывать при подходящем значении, отличном от 0.

1 голос
/ 08 сентября 2010

A.Допустима ли следующая попытка определить точку входа 'main' автономной программы на C ++?

Нет.Стандарт C ++ гласит: «Программа должна содержать глобальную функцию с именем main» (§3.6.1 / 1).В вашей программе функция main не находится в глобальном пространстве имен;это в безымянном пространстве имен.

Неявная директива using позволяет искать и использовать только имена из безымянного пространства имен во вложенном пространстве имен;он не добавляет эти имена во вложенное пространство имен.В частности, «директива using using не добавляет никаких элементов в декларативную область, в которой она появляется» (§7.3.4 / 1).

Эта программа плохо работает?и почему?

Программа не обязательно плохо сформирована.Не существует правила против использования функции с именем main в пространстве имен, отличном от глобального пространства имен;такая функция просто не является main функцией.namespace { int main(); } и int main() - две разные функции, и правильно сформированная программа может иметь обе из них.

Обратите внимание, что если ваша программа не имеет функции main в глобальном пространстве имен, тогдапрограмма не сформирована (поскольку, как указано выше, программа в размещенной среде должна иметь основную функцию).

B.Я прошел через обсуждения на EXIT_FAILURE и EXIT_SUCCESS, но не могу сделать вывод, что EXIT_SUCCESS всегда должно быть 0.

Нет требования, чтобы EXIT_SUCCESS расширялся до 0,Стандарт C просто говорит, что в <stdlib.h>,

определены макросы: ... EXIT_FAILURE и EXIT_SUCCESS, которые расширяются до целочисленных константных выражений, которые можно использовать в качестве аргумента *Функция 1044 * для возврата статуса неудачного или успешного завершения, соответственно, в хост-среду (C99 §7.20 / 3).

(Поскольку эти два макроса определены в <cstdlib>, стандарт C содержитспецификация для них).

0 голосов
/ 08 сентября 2010

A.Когда я пытаюсь запустить ваш код в Visual C ++ 2010, я получаю следующее:

Ошибка 1 ошибка LNK1561: должна быть определена точка входа

В C ++ main должен бытьв глобальном пространстве имен (т.е. :: main) и не может быть функцией-членом (класса или экземпляра), хотя имя не зарезервировано и может использоваться для других (обычных) функций-членов или функций, не являющихся членами.

Статус выхода

Значение, возвращаемое из главной функции, становится статусом выхода процесса, хотя стандарт C приписывает конкретное значение только двум значениям: EXIT_SUCCESS ( (традиционно ноль ) и EXIT_FAILURE.Значение других возможных возвращаемых значений определяется реализацией.

Подробнее об этом здесь .

...