главное в пространстве имен - PullRequest
30 голосов
/ 18 октября 2010

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

namespace somenamespace{

int main(void){
 return 0;
}

}

Ответы [ 3 ]

49 голосов
/ 18 октября 2010

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

25 голосов
/ 18 октября 2010

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

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

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

4 голосов
/ 18 октября 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...