получить правильный компилятор для C ++ - PullRequest
9 голосов
/ 21 февраля 2010

Я пытаюсь выучить c ++, но большинство учебников и книг, которые я прочитал или посмотрел, учит вас этому ...

(Я предполагаю, что, как и большинство учебных пособий, вначале они учат кодировать либо в консоли win32, либо в консоли CLR. В любом случае следующее не работает.)

#include <iostream>
int main(  )
{
    std::cout << "Hello World\n";
    return (0);
}

У меня есть IDE Visual C ++ 2008 Express, и они принимают такой код

#include "stdafx.h"


int _tmain(int argc, _TCHAR* argv[])
{
    return 0;
}

Или вот так

#include "stdafx.h"

using namespace System;

int main(array<System::String ^> ^args)
{
    Console::WriteLine(L"Hello World");
    return 0;
}

Честно говоря, нет никакой разницы ни в одном из них, и я не уверен, стоит ли мне просто скачивать старый компилятор, чтобы он работал. Если кто-то может сказать мне, в чем разница и куда идти дальше. Это очень поможет. Спасибо [Изменено]

Я пытаюсь сделать простой привет мир. Но я получаю ошибку "система не может найти указанный путь". У меня есть скриншот, который показывает, как выглядит ошибка. Это также говорит о том, что мой проект устарел, когда я четко сохранил файл перед его сборкой. Видимо не может найти исполняемый файл. Я пошел в отладочную папку и не увидел ни одного файла .exe.

Screenshot

Screenshot

[Изменено]

Хорошо, теперь, когда я пытаюсь построить проект, я получаю следующие ошибки

1>------ Rebuild All started: Project: test, Configuration: Debug Win32 ------
1>Deleting intermediate and output files for project 'test', configuration 'Debug|Win32'
1>Compiling...
1>stdafx.cpp
1>Compiling...
1>test.cpp
1>c:\users\numerical25\desktop\test\test\test.cpp(1) : warning C4627: '#include <iostream>': skipped when looking for precompiled header use
1>        Add directive to 'stdafx.h' or rebuild precompiled header
1>c:\users\numerical25\desktop\test\test\test.cpp(6) : error C2653: 'std' : is not a class or namespace name
1>c:\users\numerical25\desktop\test\test\test.cpp(6) : error C2065: 'cout' : undeclared identifier
1>Build log was saved at "file://c:\Users\numerical25\Desktop\test\test\Debug\BuildLog.htm"
1>test - 2 error(s), 1 warning(s)
========== Rebuild All: 0 succeeded, 1 failed, 0 skipped ==========

Вот код, который я использовал

#include <iostream>
#include "stdafx.h"

int main(  )
{
    std::cout << "Hello World\n";
    return (0);
}

Примечание: я пытался использовать его с #include "stdafx.h" и без него. Когда я пытался использовать его без #include "stdafx.h", он сказал, что я могу его пропустить.

Ответы [ 11 ]

19 голосов
/ 21 февраля 2010

Не уверен, что вы спрашиваете. Первые два примера, которые вы дали, являются действительными программами на C ++, которые должны (будут) компилироваться с VC ++. Третий пример - это программа на C ++ / CLI, которая должна быть скомпилирована с переключателем компилятора / CLR (это называется Managed C ++).

РЕДАКТИРОВАТЬ : Добавление более конкретной информации (из комментария ниже):

Первые два примера - это стандартный (нативный) C ++ (хотя второй пример имеет макросы, принадлежащие MS). Они компилируются в нативный код. Третий - это C ++ / CLI («управляемое» расширение для C ++). Компилируется в управляемый (.NET) код. Только третий фрагмент каким-либо образом взаимодействует с платформой .NET. Все три являются абсолютно компилируемыми и запускаемыми с использованием соответствующих проектов в VS 2008 (без командной строки)!

Судя по вашему последнему обновлению, вы, вероятно, изменили некоторые свойства проекта и изменили некоторые пути. Приложение строится, но когда вы пытаетесь запустить его через VS (кстати, вы должны сделать это с <Ctrl>+F5), исполняемый файл не может быть найден (есть несколько способов испортить это, изменив или поиграв с различные настройки).

Обратите внимание на разницу между зданием и работой. Сборка - это процесс компиляции и компоновки вашего исходного кода. Запуск запускает получившийся исполняемый файл. Вы, кажется, запутались между ними (судя по вашим жалобам на диалоговое окно «... устарело»). Диалоговое окно «... устарело» является нормальным, если вы попытаетесь запустить без перекомпоновки после внесения изменений в проект (даже если это изменение будет сохранено). Просто убедитесь, что вы нажимаете «да». Вам необходимо построить проект, прежде чем вы сможете запустить it.

Моя рекомендация - полностью удалить ваш проект и решение. Создайте новый пустой проект, как это предлагается в другом месте в этом очень тяжелом потоке, и не изменяйте никакие параметры проекта. Если это не работает, что-то серьезно не так!

ДРУГОЕ РЕДАКТИРОВАНИЕ: Просто для завершения, поскольку этот вопрос постоянно менялся:

Как уже отмечали другие, вашей конечной проблемой с первым фрагментом кода является использование предварительно скомпилированных заголовков (PCH). PCH включены по умолчанию в новых проектах VS C ++. Их целью является ускорение компиляции, когда многие файлы реализации содержат одинаковый набор заголовков, что не позволяет компилятору анализировать файлы заголовков для каждого модуля компиляции.

У вас есть три варианта:

  1. (рекомендуется) Отключить PCH - Свойства проекта -> Свойства конфигурации -> C / C ++ -> Предварительно скомпилированные заголовки: установите Создать / Использовать предварительно скомпилированный заголовок в Не использовать предварительно скомпилированные заголовки . (Вам не нужно ничего делать с файлом "stdafx.h" или #include.)
  2. Поместите ваши обычно используемые #include s в "stdafx.h". В вашем случае вы должны поместить #include <iostream> в "stdafx.h".
  3. Поместите #include s после `#include" stdafx.h ". Microsoft требует, чтобы "stdafx.h" был первым включенным файлом в модуле компиляции.
7 голосов
/ 22 февраля 2010

Незначительный момент, который я не вижу в других местах ответов: при использовании предварительно скомпилированных заголовков, таких как ваш stdafx.h, вам нужно сначала включить их. Измените его на:

#include "stdafx.h"
#include <iostream>

и это должно исправить ошибки об этом.

В качестве альтернативы может быть проще просто отключить предварительно скомпилированные заголовки: «Проект»> «Свойства»> «Свойства конфигурации»> C / C ++> «Предварительно скомпилированные заголовки»> Переключить первый параметр на «Не использовать предварительно скомпилированные заголовки». Они могут быть полезны для больших проектов, но будут неудобными и раздражающими во время обучения, поскольку у них есть дополнительные правила (такие как «должны быть включены в первую очередь»), которые не являются требованиями стандарта C ++.

4 голосов
/ 21 февраля 2010

«Разница» педантична. Последние являются просто специфичными для Microsoft точками входа .

Когда вы изучаете C ++, я рекомендую вам использовать компилятор и, предпочтительно, операционную систему, которая позволяет вам сосредоточиться на C ++, а не на платформе. Для этого я рекомендую g ++ в дистрибутиве Linux, таком как Ubuntu .

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

2 голосов
/ 21 февраля 2010

Visual C ++ Express скомпилирует первый пример просто отлично. Однако вам необходимо убедиться в правильности настроек проекта:

  1. Создать «Пустой проект»
  2. «Добавить новый элемент ...» в проект через меню «Проект». Выберите файл C ++ (.cpp).
  3. Копировать / Вставить код в новый файл
  4. Нажмите F5 для компиляции и запуска.
  5. Когда появится диалоговое окно «Проект устарел», нажмите «Да» (построить проект)

Приведенные выше шаги гарантируют, что VC ++ Express не рассматривает ваш файл как специальное консольное приложение Win32 / Windows.

РЕДАКТИРОВАТЬ: добавлен дополнительный шаг 5 для предотвращения диалога «Не удается найти ...». Мне удалось получить тот же диалог, убедившись, что exe-файл не существует, и ответив «Нет» на диалог сборки. С чистым, пустым проектом exe-файл еще не существует. Он должен быть построен первым. Если вы ответите «нет», не собирайте его, VC ++ покорно не создает исполняемый файл и позже жалуется, что не может найти его при попытке запустить его позже.

2 голосов
/ 21 февраля 2010
int main();
int main(int argc, char* argv[]);

Это стандартные C ++.

int _tmain(int argc, _TCHAR* argv[]);
int wmain(int argc, wchar_t* argv[]);

Это Windows * для обработки аргументов Unicode. См. В чем разница между _tmain () и main () в C ++? .

int main(array<System::String^>^ args);

Это , а не C ++. Это C ++ / CLI.

Для лучшей переносимости всегда используйте первую форму.


Кроме того,

int main(int argc, char** argv, char** envp);

Это обычно видимое расширение POSIX. Windows также поддерживает эту форму main. envp означает (указатель на) переменные окружения.

int main(int argc, char** argv, char** envp, char** apple);

Очевидно, это только для Mac.

void main();

И это неправильно (нестандартно, некоторые компиляторы (например, gcc) отклонят его).

1 голос
/ 21 февраля 2010

I. Предварительно скомпилированный заголовок

#include "stdafx.h"

это какая-то хитрая штука, которая встречается у вас на пути. Если вы создаете проект, VC обычно включает предварительно скомпилированный заголовок. Это означает, что создается один заголовок stdafx.h, который компилируется только один раз. Это сделано для ускорения времени компиляции в больших средах. Если вы запускаете C ++ это смущает вас. Если вы используете stdafx.h, он имеет в качестве первого заголовка в файле cpp.

II. Юникод (Utf16)

int _tmain(int argc, _TCHAR* argv[])

Microsoft использует UTF16 для реализации строк Unicode. Это означает, что вы получаете две версии main.

int main(int argc, char* argv[])
int main(int argc, wchar_t* argv[])

Это также сбивает с толку, если вы начинаете.

Чтобы просто начать, вы можете использовать любой редактор, который вы хотите. Создайте файл. Откройте командную строку Visdual studio 2008

cl main.cpp
main.exe

и вы увидите Hello World, используя код из книг. Затем попытайтесь понять некоторые настройки VC.

Но вы всегда должны использовать пустой проект. Иначе вам нужно заботиться о stdafx, UNICODE, ...

1 голос
/ 21 февраля 2010

Как указал STingRaySC , все три ваших примера будут скомпилированы в VC2008 express; Просто примеры 2 и 3 - это то, что VC2008 Express будет загружать изначально при создании проекта (один из примеров - для Managed C ++, как упоминалось в STingRaySC).

Вы можете просто удалить код во втором примере (проект консольного приложения C32 Win32) и вставить более стандартную программу hello world из первого примера. Он должен скомпилироваться и нормально работать в VC2008 Express - он сделал для меня.

0 голосов
/ 22 февраля 2010

Woot !! Я понял!!! Ниже мой оригинальный код

#include <iostream>
int main(  )
{
    std::cout << "Hello World\n";
    return (0);
}

Отсутствовал заголовочный файл #include "stdafx.h". Так что я должен был включить его туда, поэтому я добавил это так

#include <iostream>
#include "stdafx.h"

int main(  )
{
    std::cout << "Hello World\n";
    return (0);
}

Я все еще получал сообщение об ошибке, подобное тому, что вы видите в моем отредактированном вопросе внизу. Итак, что я сделал, я взял #include и добавил его в свой заголовочный файл, и тогда это сработало !!!!!

Даже в книгах и множестве учебных пособий показано добавление #include к фактическому cpp, по некоторым причинам в экспресс-выпуске мне пришлось добавить его в заголовок, чтобы он работал. Я не знаю, ПОЧЕМУ, но это решение, и теперь оно работает.

0 голосов
/ 21 февраля 2010

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

  1. File-> New-> Project
  2. Выберите тип проекта "Win32", затем шаблон "Консольный проект Win32"
  3. Дайте проекту название и местоположение
  4. OK
  5. Выберите «Настройки приложения»
  6. Чек "Пустой проект"
  7. В «Обозревателе решений» щелкните правой кнопкой мыши папку «Источники», затем выберите «Добавить-> Новый элемент»
  8. Введите имя файла в поле «имя», используя расширение .cpp (вы можете игнорировать шаблоны, если хотите).
  9. Введите ваш код в новом файле.
0 голосов
/ 21 февраля 2010

Загрузите и установите Dev-C ++ в вашей системе. Если код не работает на Visual C ++, попробуйте его на Dev-C ++ (который использует компилятор GCC). Вы можете получить те же результаты или другое сообщение об ошибке. Всякий раз, когда вы получаете сообщение об ошибке, которое вы не понимаете, выполните поиск в Интернете сообщения об ошибке.

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