Подтвердить что ты не робот

Main в пространстве имен

Почему это не компилируется? Компилятор не может найти основной, но почему это так?

namespace somenamespace{

int main(void){
 return 0;
}

}
4b9b3361

Ответ 1

3.6.1/1 - " Программа должна содержать глобальную функцию main, которая является назначенным началом программа. Это определяется реализацией будь то программа в автономном режиме необходимо определить среду основная функция. [Примечание: в автономная среда, запуск и окончание - это реализация; запуск включает выполнение конструкторы для объектов пространства имен область с статическим временем хранения; завершение содержит исполнение деструкторы для объектов со статическими срок хранения. -end note]

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

Ответ 2

Компонент ищет ::main, а не ::somenamespace::main. main, который вызывается при запуске программы, должен находиться в глобальном пространстве имен.

@Chubsdad указал на соответствующий язык в стандарте, в котором говорится об этом. Но стандарт теперь написан в странном "стандартном", который имеет много общего с легализацией. Я чувствовал, что простая английская заявка о том, что происходит, может быть лучше.

Примечание. Существует причина, по которой стандарт написан таким образом. В стандарте вы хотите, чтобы каждый термин, который вы используете, имел очень точный и четко определенный смысл, и вы не хотите, чтобы этот смысл менялся в зависимости от контекста, потому что он значительно усложняет интерпретацию стандарта. Это на самом деле очень похоже на причину, по которой легализация выглядит так, как она.

Ответ 3

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

Реализация мудрая, измененное имя вашего основного символа было изменено с ожидаемого имени из-за пространства имен, поэтому компоновщик просто не находит нужную запись в таблице символов.