2013-12-26 2 views
0

В Java у каждого класса есть свой собственный основной метод, но когда я попытался создать два cpp-файла на C++, оба с их собственными основными методами, компилятор сказал мне, что main уже определен. Означает ли это, что мне нужен новый проект для каждого основного метода? Я следую учебному курсу на C++, и я не хочу создавать новый проект для каждой примерной программы, я просто хочу, чтобы один проект имел несколько основных методов. Это возможно?Основные методы в C++ в разных файлах классов?

+3

В C++ нет понятия «проект». Для каждого исполняемого файла требуется 'main()'. Вот и все. – juanchopanza

+1

Это более специфично. Пожалуйста, сообщите нам, какой идеал вы используете. –

+0

Является ли проект «решением» тогда? В визуальной студии это то, что она называет, я понятия не имею, является ли это конвенцией или нет ... –

ответ

2

У вашего .cpp нет «методов», возможно, что вы определили свободные функции (т. Е. Процедуры, не связанные с каким-либо классом), и все они находятся в одном и том же пространстве имен. Это, конечно, дает ошибки на этапе связывания, так как вы многократно определяете одно и то же.

Если вы хотите определить класс, вы можете использовать ключевое слово class; конечно, в этом случае, как и в Java, каждый класс, который вы определяете, может иметь свой собственный метод main.

Я следую учебному курсу на C++, и я не хочу создавать новый проект для каждой примерной программы, которую мы делаем, мне просто нужен один проект с несколькими основными методами. Это возможно?

№. Точка входа - всего одна - глобальная функция main. Если вы хотите разрешить несколько возможных «подпрограмм», напишите каждый из них в отдельной функции и определите, какой из них нужно вызвать из одного main.

+0

Хорошо, думаю, теперь я понимаю. В Java у вас может быть один проект с несколькими основными функциями, но C++ вообще не работает? –

0

В MS Visual Studio одно «решение» (файл .sln) будет содержать несколько «проектов». Каждый исполняемый файл, который вы хотите создать, будет иметь свой собственный «проект», и вы можете иметь много таких проектов в одном и том же «решении». Не каждый «проект» должен создавать исполняемый файл, хотя часто «проект» просто создает библиотеку, например библиотеку общих утилит, которую могут включать многие ваши исполняемые файлы. Когда вы помещаете два проекта «main()» в два .cpp-файла в одном проекте, компилятор должен скомпилировать оба файла .cpp в .obj-файлы, а затем, вероятно, попытался создать один исполняемый файл с обоими .obj-файлами, связанными с исполняемый файл. И вы получите сообщение об ошибке, когда компоновщик попытается поместить обе функции «main()» в один и тот же исполняемый файл, так как вы не можете иметь две точки входа с тем же именем.

Что говорит Маттео о классах и методах, вы также должны понимать.

+0

А, я вижу. Таким образом, решение может содержать несколько «проектов»? Но «проект» не может содержать более одного класса с основным методом? Я понимаю, думаю. –

+0

@ opiop65 Вы еще не поняли полностью. Функция 'main', на которую вы ссылаетесь (т. Е. Точка входа в исполняемый файл), не живет в классе. Это свободная функция, объявленная в глобальном пространстве имен. Вы можете иметь столько классов, сколько хотите, с функциями, называемыми 'main', и они будут полностью не связаны друг с другом и не связаны с функцией entrypoint,' main'. Я думаю, вы сбиты с толку, потому что вы пришли с Java. В C++ вам не нужно иметь класс, чтобы иметь функцию. – JBentley

+0

Так как же компилятор выбирает правильную «главную» функцию? Моя книга также рассказала мне, что вы только что сказали, что я могу иметь несколько функций с идентификатором «main», но как это работает? –

1

В C# каждый проект имеет свой собственный файл Program.cs, который является точкой входа. Если в итоге вы комбинируете несколько проектов, тривиально сообщить Visual Studio, чтобы они скомпилировали его как библиотеку, и выберите точку входа проекта.

В C++ вы можете иметь только одно определение main в глобальном пространстве имен. Например, у вас есть свой собственный основной объект в пространстве имен, которое вызовет ::main. Например, этот метод выполняется в SDL, так что пользователю не нужно самостоятельно создавать main, и он может связать -lSDL_main.

Смежные вопросы