Действительно ли Visual C++ так же мощен как gcc?

Моим определением мощных является способность настроить.

Я знаком с gcc Я хотел попробовать MSVC. Так, я искал gcc эквивалентные опции в msvc. Я не могу найти многих из них.

управление видом вывода

Stop after the preprocessing stage; do not run the compiler proper.
gcc: -E
msvc: ???

Stop after the stage of compilation proper; do not assemble.
gcc: -S
msvc: ???

Compile or assemble the source files, but do not link.
gcc: -c
msvc:/c

Полезный для отладки

Print (on standard error output) the commands executed to run the stages of compilation.
gcc: -v
msvc: ???

Store the usual “temporary” intermediate files permanently;
gcc: -save-temps
msvc: ???
  1. Есть ли некоторый gcc <-> msvc руководство по отображению параметра компилятора?
  2. Сводка Опции gcc перечисляет больше опций в каждом разделе, чем Параметры компилятора, Перечисленные по категориям. Существует партия ада важных и интересных вещей, отсутствующих в msvc. Я пропускаю что-то, или msvc действительно менее мощен, чем gcc.

9
задан Kate Gregory 24 June 2010 в 10:21
поделиться

3 ответа

MSVC - это IDE, gcc - это просто компилятор. CL (компилятор MSVC) может выполнять большинство шагов, которые вы описываете с точки зрения gcc. CL /? дает помощь.

Например.

Предварительная обработка в стандартный вывод:

CL /E

Скомпилировать без компоновки:

CL /c

Сгенерировать сборку (хотя, в отличие от gcc, это не мешает компиляции):

CL /Fa

CL на самом деле просто компилятор, если вы хотите увидеть, какие команды IDE генерирует для компиляции и связывания. Проще всего посмотреть в разделе командной строки на страницах свойств для элемента в IDE. CL не вызывает отдельный препроцессор или ассемблер, поэтому нет отдельных команд для просмотра.

Для -save-temps среда IDE выполняет отдельную компиляцию и компоновку, поэтому объектные файлы в любом случае сохраняются. Чтобы сохранить вывод препроцессора и вывод ассемблера, вы можете включить / P и / Fa через IDE.

gcc и CL разные, но я бы не сказал, что MSVC не хватает «чертовски много», и уж точно не тех результатов, которые вы ищете.

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

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

Если вы смотрите исключительно на количество доступных опций как на меру "мощности" или "гибкости", то вы, вероятно, сочтете gcc победителем, просто потому, что gcc работает со многими платформами, кроме Windows, и имеет специфические опции для многих из этих платформ, которые вы, очевидно, не найдете в MSVC. gcc (ну, инструментарий gcc) также компилирует множество языков помимо C и C++; я недавно использовал его для Objective-C, например.

EDIT: Я согласен с Дином в том, что он сомневается в обоснованности вашего вопроса. Да, MSVC (cl) имеет опции, эквивалентные многим опциям gcc, но нет, количество опций на самом деле мало что значит.

Короче говоря: если только вы не делаете что-то особенное, вы найдете MSVC достаточно "мощным" на платформе Windows, и вам, скорее всего, не будет хватать никаких опций gcc.

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

Для эквивалента -E, cl.exe имеет /P (он не "останавливается после стадии препроцессирования", но выводит вывод препроцессора в файл, что в основном одно и то же).

Для -S все немного туманнее, поскольку этапы "компиляции" и "сборки" происходят в нескольких местах в зависимости от того, какие другие опции вы указали (например, если у вас включена оптимизация всей программы, то машинный код не генерируется до этапа линковки).

Что касается -v, то Visual C++ - это не то же самое, что GCC. Он выполняет все этапы компиляции непосредственно в cl.exe (и link.exe), поэтому нет никаких "выполненных команд" для отображения. Аналогично для -save-temps: поскольку все происходит непосредственно в cl.exe и link.exe, единственными "временными" файлами являются .obj файлы, которые создает cl.exe, и они всегда сохраняются в любом случае.

Однако, в конце концов, GCC - это проект с открытым исходным кодом. Это означает, что любой, у кого есть желание почесаться, может добавить любые опции командной строки, которые ему нравятся, при относительно небольшом сопротивлении. Для Visual C++, коммерческого продукта с закрытым исходным кодом, каждая опция должна иметь экономическое обоснование, проектные совещания, планы тестирования и так далее. Каждая новая функция начинается с минус 100 баллов.

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