Ответ на этот вопрос зависит от платформы; то, что происходит в Linux, отличается от того, что происходит, например, в Solaris.
Самая простая часть (поскольку она не зависит от платформы) - это разделение 'gcc' и 'g ++':
- gcc - это компилятор GNU C из GCC (коллекция компиляторов GNU).
- g ++ - это компилятор GNU C ++ от GCC.
Сложная часть, потому что она зависит от платформы, означает «CC» (и «cc»).
- В Solaris CC обычно является именем компилятора Sun C ++.
- В Solaris cc - это обычно имя компилятора Sun C.
- В Linux, если он существует, CC, вероятно, является ссылкой на g ++.
- В Linux cc - это ссылка на gcc.
Однако даже в Solaris может быть, что cc - это старый компилятор C на основе BSD из /usr/ucb
. На практике это обычно не устанавливается, и есть просто заглушка, которая не работает, что наносит ущерб тем, кто пытается скомпилировать и установить самонастраивающееся программное обеспечение.
В HP-UX по умолчанию 'cc' по-прежнему является компилятором C только для K & R, установленным для перекомпоновки ядра, когда это необходимо, и непригодным для работы современного программного обеспечения, поскольку он не поддерживает стандарт C. Вы должны использовать альтернативные имена компиляторов ('acc' IIRC). Точно так же в AIX системный компилятор C называется такими именами, как 'xlc' или 'xlc32'.
Как правило, системный компилятор по умолчанию назывался 'cc', и самонастраивающееся программное обеспечение использует это имя, когда не знает, что еще использовать.
POSIX попытался узаконить свой путь решения этой проблемы, потребовав существования программ c89 (первоначально) и позже c99; это компиляторы, совместимые со стандартами ISO / IEC 9899: 1989 и 9899: 1999 C. Сомнительно, что POSIX удалось.
Вопрос касается различий в возможностях и библиотеках. Как и раньше, ответ частично зависит от платформы, а частично - от общего.
Большая разница между компиляторами C и C ++. Компиляторы C ++ будут принимать программы на C ++ и не будут компилировать произвольные программы на C. (Хотя можно написать C в подмножестве, которое также понимается C ++, многие программы на C не являются допустимыми программами на C ++). Аналогично, компиляторы C будут принимать программы на C и отклонять большинство программ на C ++ (поскольку большинство программ на C ++ используют конструкции, недоступные в C).
Набор доступных для использования библиотек зависит от языка. Программы на C ++ обычно могут использовать библиотеки C на данной платформе; Программы на C обычно не могут использовать библиотеки C ++. Итак, C ++ имеет больший набор доступных библиотек.
Обратите внимание, что если вы находитесь в Solaris, объектный код, созданный CC, несовместим с объектным кодом, созданным g ++, - это два отдельных компилятора с отдельными соглашениями для таких вещей, как обработка исключений и искажение имен (и имени mangling сознательно отличается, чтобы несовместимые объектные файлы не были связаны друг с другом!). Это означает, что если вы хотите использовать библиотеку, скомпилированную с помощью CC, вы должны скомпилировать всю свою программу с помощью CC. Это также означает, что если вы хотите использовать одну библиотеку, скомпилированную с помощью CC, а другую - скомпилированную с помощью g ++, вам не повезло. Вы должны перекомпилировать хотя бы одну из библиотек.
С точки зрения качества создаваемого ассемблера, GCC (GNU Compiler Collection) делает очень хорошую работу. Но иногда нативные компиляторы работают немного лучше. Я полагаю, что компиляторы Intel имеют более обширную оптимизацию, которая еще не была воспроизведена в GCC. Но любые подобные понтификации опасны, пока мы не знаем, на какой платформе вы заинтересованы.
С точки зрения языковых возможностей все компиляторы, как правило, достаточно близки к существующим стандартам (C ++ 98, C ++ 2003, C99), но обычно между стандартным языком и языком, поддерживаемым компилятор. Поддержка старого стандарта C89 практически одинакова (и полная) для всех компиляторов Си. Есть различия в темных углах языка. Вы должны понимать «неопределенное поведение», «определяемое системой поведение» и «неопределенное поведение»; если вы вызовете неопределенное поведение, вы получите разные результаты в разное время. Есть также много вариантов (особенно с GCC), чтобы настроить поведение компилятора. GCC имеет множество расширений, которые упрощают жизнь, если вы знаете, что нацелены только на это семейство компиляторов.