получение правильного компилятора для C++

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

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

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

IDE, который я имею, является выпуском Экспресса Visual C++ 2008 года, и они принимают код как это

#include "stdafx.h"


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

Или как это

#include "stdafx.h"

using namespace System;

int main(array ^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 ': 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 
#include "stdafx.h"

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

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

9
задан Adaline Simonian 13 August 2017 в 09:29
поделиться

11 ответов

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

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

и это должно исправить ошибки, связанные с ним.

В качестве альтернативы, может быть проще просто отключить прекомпилированные заголовки: Project > Properties > Configuration Properties > C/C++ > Precompiled Headers > Переключите первый вариант на "Not using precompiled headers". Они могут быть полезны для больших проектов, но будут неудобными и раздражающими, пока вы учитесь, так как они имеют дополнительные правила (например, "должны быть включены первыми"), которые не являются требованиями стандартного C++.

7
ответ дан 4 December 2019 в 06:40
поделиться

Запишите функцию-заглушку (многие подробности не указаны в коде)

BOOL WINAPI ChangeWindowMessageFilter(      
   UINT message,
   DWORD dwFlag)
{
   if (running_on_vista_or_later)
   {
      ....
      pfn = GetProcAddress(... "ChangeWindowMessageFilter");
      return pfn (message, dwFlag);
   }

   return TRUE;
}

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

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

-121--4518849-

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

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

-121--4950378-
int main();
int main(int argc, char* argv[]);

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

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

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

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

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

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


Также

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

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

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

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

void main();

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

2
ответ дан 4 December 2019 в 06:40
поделиться

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

EDIT: Добавление более конкретной информации (из комментария ниже):

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

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

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

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

ЕЩЕ РАЗ: Просто для завершения, поскольку этот вопрос постоянно менялся:

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

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

  1. (Рекомендуется) Отключить PCH -- Свойства проекта --> Свойства конфигурации --> C/C++ --> Предкомпилированные заголовки: Установите Create/Use Precompiled Header на Not Using Precompiled Headers. (Вам не нужно ничего делать с файлом "stdafx.h" или #include для него.)
  2. Поместите ваши часто используемые #includeы в "stdafx.h". В вашем случае, вы поместите #include в "stdafx.h".
  3. Поместите ваши #includes после `#include "stdafx.h". Microsoft требует, чтобы "stdafx.h" был первым включаемым файлом в единице компиляции.
19
ответ дан 4 December 2019 в 06:40
поделиться

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

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

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

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

2
ответ дан 4 December 2019 в 06:40
поделиться

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

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

1
ответ дан 4 December 2019 в 06:40
поделиться

_tmain с _TCHAR argv - это способ, которым среда выполнения C позволяет вам обрабатывать Unicode. Если _UNICODE определен, то _tmain будет расширен до wmain , а аргумент _TCHAR будет иметь тип wchar_t. Если _UNICODE не определен, тогда _tmain будет расширен до main, что будет стандартом ANSI.

Следовательно, пока _UNICODE не определен, второй опубликованный вами фрагмент соответствует стандарту.

0
ответ дан 4 December 2019 в 06:40
поделиться

I. Precompiled header

#include "stdafx.h"

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

II. Юникод (Utf16)

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

Microsoft использует UTF16 для реализации строк юникода. Это означает, что вы получаете две версии 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
ответ дан 4 December 2019 в 06:40
поделиться

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

  1. File->New->Project
  2. Выберите Project Type "Win32", затем Template "Win32 Console Project"
  3. Дайте проекту имя и местоположение
  4. OK
  5. Выберите "Application Settings"
  6. Отметьте "Empty Project"
  7. В "Solution Explorer" щелкните правой кнопкой мыши на папке "Sources", затем Add->New Item
  8. Введите имя файла в поле "name", используя расширение .cpp (вы можете игнорировать шаблоны, если хотите).
  9. Введите ваш код в новый файл.
0
ответ дан 4 December 2019 в 06:40
поделиться

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, по какой-то причине в express edition мне пришлось добавить его в header, чтобы он работал. Я не знаю ПОЧЕМУ, но это решение и теперь оно работает.

0
ответ дан 4 December 2019 в 06:40
поделиться

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

-1
ответ дан 4 December 2019 в 06:40
поделиться

Состояние просмотра - это своего рода хеш-карта (или, по крайней мере, вы можете думать об этом путь), которую ASP.NET использует для хранения всей временной информации о странице - например, какие опции в настоящее время выбраны в каждом поле выбора, какие значения есть в каждом текстовом поле, какая панель открыта и т.д. Его также можно использовать для хранения любой произвольной информации.

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

Просто будьте внимательны к тому, сколько информации вы храните в состоянии просмотра, хотя... он может быстро раздуться и медленно передаваться каждый раз на сервер и обратно.

Что касается шифрования, я не знаю, насколько он силен, но он точно не легко читается человеком. Я бы не стал использовать его для получения конфиденциальной информации. Как указано в комментариях, он вообще не зашифрован. Просто база закодирована, что легко обратимо.

-121--1890803-

Вы можете сначала немного манипулировать. например, заменить все новые строки на пробелы, затем заменить 2 вхождения и другие < br/> на другой разделитель, например | . после этого вы можете получить свои поля.

html="""
Company A<br />
123 Main St.<br />
Suite 101<br />
Someplace, NY 1234<br />
<br />
<br />
<br />
Company B<br />
456 Main St.<br />
Someplace, NY 1234<br />
<br />
<br />
<br />
"""
import re
newhtml=html.replace("\n","")
pat=re.compile("(<br \/>){2,}",re.DOTALL|re.M)
print pat.sub("|",newhtml)

вывод

$ ./python.py
Company A<br />123 Main St.<br />Suite 101<br />Someplace, NY 1234|Company B<br />456 Main St.<br />Someplace, NY 1234|

Теперь информация о компании разделена трубами.

-121--3383505-

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

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

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

4
ответ дан 4 December 2019 в 06:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: