Расширение файла кода C ++? .cc vs .cpp [закрыто]

599

Я видел код C ++, сохраненный как .ccи .cppфайлы. Есть ли разница между ними?

Руководство по стилю Google, кажется, предлагает .cc, но не дает объяснения.

В основном я занимаюсь программами в системах Linux.

Джессика
источник
85
Заключение Это не имеет значения. Возможное происхождение cc = C с классами, cpp = C плюс плюс
Lazer
6
Это важно, чтобы лязгать ++. Когда вы даете ему заголовочный файл C ++ с именем, оканчивающимся на .h, clang ++ предупреждает вас.
allyourcode
4
Еще один инструмент, который немного волнует - это Emacs. При чистой конфигурации .emacs открытие («поиск» на языке emacs) файла .h активирует режим c, а не режим c ++. Конечно, вы можете настроить emacs для чего-то другого (как и для всего в emacs), но я хочу сказать, что c-mode - это стандартная настройка по умолчанию.
allyourcode
3
lintзаботится, .Cэто C ++ и .cC без какого- .ccлибо понимания или .cpp. По крайней мере, в AIX 6.1.
Джесси Чисхолм
5
Ответ «это не имеет значения» не очень помогает. Вопрос полностью актуален. ОП искал твердое соглашение, чтобы придерживаться. Лучшим ответом будет: «К сожалению, сообщество C ++ не имеет твердого соглашения по этому вопросу». Грустно, если подумать. Все остальные популярные языки имеют одно уникальное расширение файла. Я бы придерживался того, что использует важный проект, например, gcc. Они используют.cc .
Лусио Пайва

Ответы:

702

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

JaredPar
источник
89
Ну, это верный момент, но он не отвечает на вопрос пользователя.
Викрантт
319
cc быстрее печатать
спасибо
50
Почему это принятый ответ? Новые программисты не будут знать, что это не имеет значения, и они заслуживают прямого ответа.
Robben_Ford_Fan_boy
14
Ответа совершенно недостаточно для любознательного и внимательного программиста. Я хотел бы получить ответ на этой странице больше, поскольку он имеет более подробные объяснения.
Новин Шахруди
2
Если учесть, что компилятор, как правило, не единственный задействованный инструмент - почти всегда есть «make» или аналогичная утилита, которая будет заботиться о том, какие расширения вы используете, для соответствия правилам сборки - тогда этот ответ действительно не затрагивает ядро. проблемы вопроса. Обратите внимание, что существуют различия в зависимости от системы и набора инструментов (включая ваши любимые правила make и т. Д.), Которые влияют на решение. Например, стандартная рекурсивная многоцелевая система сборки, которую некоторые из платформ разработки серии QNX 6 не воспринимают файлы * .cpp как источники языка C ++; он хочет .cc
JoGusto
296

GNU GCC распознает все следующие как файлы C ++, и будет использовать C ++ компиляция независимо от того , вы вызываете его через GCC или G ++: .C, .cc, .cpp, .CPP, .c++, .cp, или .cxx.

Обратите внимание, что .C- case имеет значение в GCC, .cэто файл C, тогда .Cкак это файл C ++ (если вы позволите компилятору решить, что именно он компилирует).

GCC также поддерживает другие суффиксы для указания специальной обработки, например, .iiфайл будет скомпилирован как C ++, но не предварительно обработан (предназначен для отдельно предварительно обработанного кода). Все распознанные суффиксы подробно описаны на gcc.gnu.org.

Clifford
источник
5
«регистр имеет значение в GCC» - как насчет Windows (так как он не учитывает регистр)?
Девеш Хандельвал
17
@Devesh: Windows тоже. Но ОС не позволит вам иметь два файла в папке, которые различаются только регистром.
Клиффорд,
23
@DeveshKhandelwal Но это сохраняет дело
Яфарт Агарвал
229

Отличный совет, который следует использовать для make-файла и других инструментов, учитывая, что некомпиляторские инструменты при принятии решения о том, какое расширение использовать, - отличный способ помочь найти ответ, который подходит именно вам.

Я просто хотел бы добавить следующее , чтобы помочь с некоторыми .ccпротив .cppинформации , которую я нашел. Ниже приведены расширения, разбитые на разные среды (из книги «C ++ Primer Plus»):

Unix использует: .C, .cc, .cxx,.c

GNU C ++ использует: .C, .cc, .cxx, .cpp,.c++

Digital Mars использует: .cpp,.cxx

Borland C ++ использует: .cpp

Watcom использует: .cpp

Microsoft Visual C ++ использует: .cpp, .cxx,.cc

Metrowerks Codewarrior применения: .cpp, .cp, .cc, .cxx,.c++

Разные среды поддерживают разные расширения. Я тоже искал, чтобы ответить на этот вопрос и нашел этот пост. Основываясь на этом посте, я думаю, что я мог бы пойти на .hppи .cppдля облегчения кросс-платформенного / кросс-инструментального распознавания.

John S.
источник
5
Этот ответ наиболее близок к тому, что действительно пытаются решить представленный вопрос, который касается того, кто ищет твердую договоренность, которой следует придерживаться. У других языков это есть, но что касается расширения файла, то в C ++ его, похоже, нет.
Лусио Пайва
6
В каком смысле Unix не использует .cpp?
Кит Томпсон
vc ++ 6.0 не поддерживают файл .cc.
XUS
@KeithThompson cehck ответ пользователя user181548
Spyros Mourelatos
@SpyrosMourelatos Да, но это все еще тот случай, когда код C ++ в Unix-подобных системах очень часто используется .cppдля исходных файлов C ++. (В цитируемом ответе отмечается, что «cpp» - это аббревиатура для препроцессора C.)
Кит Томпсон,
79

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

Хотя компилятору все равно, что вы делаете, это личное предпочтение.

рю
источник
60
Я решил переключиться с использования .h на использование .hpp для заголовков c ++; в первую очередь потому, что другие инструменты, такие как редакторы, должны знать об этом. Кроме того, при использовании скомпилированных заголовков с gcc по умолчанию используется C для файлов .h и C ++ для файлов .hpp, если вы не используете опцию -x c ++ - header при прекомпиляции .h файл.
jdkoftinoff
5
@jd. Согласовано. Это делает автоматизированные инструменты немного проще, если h / c файлы превращаются в hpp / cpp файлы.
Пол Натан
4
g ++ не распознает .hpp как заголовок C ++ (для предварительной компиляции заголовка), но .hh это делает. Из-за этого я использовал .cc / .hh вместо .cpp / .hpp, так как на самом деле нет никакой разницы.
Tronic
12
@Tronic: поскольку 4.3 gcc распознает .hpp, сравните gcc.gnu.org/onlinedocs/gcc-4.2.4/gcc/Overages-Options.html с gcc.gnu.org/onlinedocs/gcc-4.3.6/gcc/Overa. -Options.html
CesarB
3
@CharlesAddis - Да, мне пришлось преобразовать много кода с «abcd.H» (интерфейс c ++) и «abcd.h» (интерфейс C) в одном каталоге в «abcd.hpp» и «abcd.h». «потому что просто выполнить« svn co »или распаковать на Windows или Mac OS X (с файловой системой по умолчанию) не удастся из-за« повторяющихся имен файлов »
jdkoftinoff
37

Я лично использую .ccрасширение для файлов реализации, .hhдля заголовков и .inlдля inline / шаблонов.

Как было сказано ранее, это в основном дело вкуса.

Из того, что я видел , .ccпохоже, больше « ориентированных на проекты с открытым исходным кодом », как это рекомендуется в некоторых великих стилях кодирования программного обеспечения с открытым исходным кодом, тогда как. cppкажется более оконным.

--- РЕДАКТИРОВАТЬ

Как уже упоминалось, это «из того, что я видел» , это может быть неправильно. Просто используются все проекты Windows, над которыми я работал .cpp, и многие проекты с открытым исходным кодом (которые в основном предназначены для Unix-лайков) .cc.

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

Орельская долина
источник
1
у вас есть ссылки на это? Я никогда не видел OSS .cc против Windows .cpp
Бобби
6
Visual Studio создает файлы .cpp для C ++. Я не знаю историю этого.
Натан Еллин
7
Стандарт кодирования LLVM, похоже, поддерживает .cpp / .h и помещает -*- C++ -*-тег в заголовки llvm.org/docs/CodingStandards.html ; Mozilla Coding Style предлагает .cpp / .h developer.mozilla.org/en-US/docs/Mozilla/Developer_guide/… ; KDE, похоже, слишком использует .cpp / .h quickgit.kde.org
sastanin
19

Другие используемые расширения файлов включают .cxxи .C(заглавная C). Я считаю, Бьярн Страуструп использовал .Cизначально. .cppэто имя препроцессора C, поэтому, к сожалению, он использовался и для C ++.

user181548
источник
13

Другой вариант, .cxxкогда xпредполагается, что плюс повернут на 45 °.

Windows, Mac и Linux все поддерживают, .c++поэтому мы должны просто использовать это.

FigBug
источник
12

Несколько человек говорят, что .ccничего не значит? Это может. C ++ начал жизнь как «C с классами».

Верно, что .ccи .cppтакже являются именами команд в большинстве систем Unix (c-компилятор и c-препроцессор соответственно).

Я использую .cppисключительно, но я начал на Windows. .ccэто скорее соглашение Unix, хотя я вижу его все реже и реже. В GNU make есть правила, .cppтак что это, вероятно, предпочтительнее, оно будет работать по умолчанию как в Windows, так и во всем остальном. С другой стороны, современный C ++ вообще не использует расширения для заголовков, мне это действительно не нравится. Все мои проекты используют .hдля заголовочных файлов, и они поддерживают как C, так и C ++ в максимально возможной степени посредством extern "C"и тестирования __cplusplus.

Ben Voigt
источник
2
разве это не должно быть .cwc тогда? :)
Джошуа
До того, как многие компиляторы поддерживали пространства имен, они также использовали расширение .h для стандартных заголовков. Обычно компиляторы предоставляют устаревшие версии .h, которые помещают библиотеку в глобальное пространство имен. Это позволяет поддерживать устаревший код. Однажды я где-то читал, что причина, по которой у них нет расширений .h, заключается в том, что стандарт позволяет им быть не файлами, а по сути «встроенными». Однако это может быть апокрифическим.
Клиффорд
11

Просто следуйте соглашению, используемому для проекта / команды.

Бен С
источник
11

Лично я никогда не видел .ccни одного проекта, над которым работал, но во всех технических аспектах компилятору все равно.

Кто позаботится о том, чтобы разработчики работали над вашим исходным кодом, поэтому мое эмпирическое правило состоит в том, чтобы придерживаться того, с чем ваша команда чувствует себя комфортно. Если ваша «команда» - это сообщество с открытым исходным кодом, займитесь чем-то очень распространенным, из которых, .cppкажется, любимым.

Toji
источник
Несколько известных проектов, таких как github.com/google/googletest , используют .ccв качестве расширения файлов для файлов реализации C ++
Vertexwahn
10

Как и в случае большинства стилевых соглашений, важны только две вещи:

  1. Будьте последовательны в том, что вы используете, где это возможно.
  2. Не проектируйте ничего, что зависит от конкретного используемого выбора.

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

Алан
источник
8

.Cи .ccкажется стандартным для (немногих) Unix-ориентированных программ на C ++, которые я видел. Я всегда использовал .cppсебя, так как я действительно работаю только на Windows, и это было стандартом там, как и всегда.

Я рекомендую .cppлично, потому что ... это означает "C Plus Plus". Конечно, жизненно важно, чтобы расширения файлов были аббревиатурами, но если это обоснование окажется недостаточно убедительным, другие важные вещи - это не использование клавиши Shift (что исключает .Cи .c++) и избегание метасимволов регулярных выражений, где это возможно (что исключает .c++- к сожалению, вы не можете избежать этого, .конечно.).

Это не исключает .cc, так что, хотя это ничего не значит (или делает это?), Это, вероятно, хороший выбор для Linux-ориентированного кода.

пожалуйста, удалите меня
источник
2
Но «cpp» может также означать «препроцессор C». Фактически, программа "cpp" в вашей системе, скорее всего, является препроцессором C ...
Jesper
8

Я использую .C и .h для источника и заголовка соответственно. В этом выборе есть одна приятная вещь: в командной строке легко *.[Ch]выбрать все файлы кода. Использование .Cможет быть проблемой на нечувствительных к регистру файловых системах, но если у вас есть foo.cи foo.Cв том же каталоге, вы все равно заслуживаете то, что вы получаете :)

KeithB
источник
8

Расширение .cc необходимо для использования неявных правил в make-файлах. Просмотрите эти ссылки, чтобы лучше понять make-файлы, но посмотрите в основном второй, так как он ясно говорит о полезности расширения .cc:

ftp://ftp.gnu.org/old-gnu/Manuals/make-3.79.1/html_chapter/make_2.html

https://ftp.gnu.org/old-gnu/Manuals/make-3.79.1/html_chapter/make_10.html

Я только что узнал об этом сейчас.

рукав моря
источник
Опять они просто .cppфайлы. Не беспокойся ! :-)
Том Тейлор
1
В нем говорится: «Мы рекомендуем вам использовать суффикс« .cc »для исходных файлов C ++ вместо« .C »». Я подозреваю, что это просто плохая формулировка. Использование .Cможет быть проблематичным в системах с нечувствительными к регистру файловыми системами. Я не думаю, что есть какое-то особое преимущество, например make, в использовании .ccover .cpp. Makefiles прекрасно работают с .cppисходными файлами C ++.
Кит Томпсон
7

Неважно, какое из этих расширений вы бы использовали. Выберите то, что вам больше нравится, просто будьте последовательны с именами. Единственное исключение, о котором я знаю в связи с этим соглашением об именах, - это то, что я не мог сделать WinDDK(или это WDKсейчас?) Компиляцию .ccфайлов. В Linux это вряд ли проблема.

Дмитрий
источник
6

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

Страуструп рассматривает это скорее как бизнес-соображение, чем как техническое .

Следуя его совету, давайте проверим, чего ожидают цепочки инструментов.

Для UNIX / Linux вы можете интерпретировать следующие стандартные правила GNU make как предпочтение суффиксу имени файла .cc, так как правила .cpp и .C являются просто псевдонимами:

$ make -p | egrep COMPILE[^=]+=
COMPILE.cc = $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c
COMPILE.cpp = $(COMPILE.cc)
COMPILE.C = $(COMPILE.cc)

(Примечание: псевдоним COMPILE.cxx по умолчанию отсутствует)

Так что, если вы нацелены на UNIX / Linux, и .cc, и .cpp - очень хорошие варианты.

Ориентируясь на Windows, вы ищете проблемы с .C, так как ее файловая система не учитывает регистр. И вам может быть важно отметить, что Visual Studio предпочитает суффикс .cpp

При нацеливании на macOS обратите внимание, что Xcode предпочитает .cpp / .hpp (только что проверено на Xcode 10.1). Вы всегда можете изменить шаблон заголовка, чтобы использовать .h.

Для чего бы это ни стоило, вы также можете основывать свое решение на кодовых базах, которые вам нравятся. Google использует .cc, а LLVM libc ++ использует .cpp, например.

Как насчет заголовочных файлов? Они компилируются в контексте файла C или C ++, поэтому компилятору или системе сборки не нужно отличать .h от .hpp. Однако может возникнуть проблема с подсветкой синтаксиса и автоматическим отступом вашего редактора / IDE, но это можно исправить, связав все файлы .h с режимом C ++. В качестве примера, моя конфигурация emacs в Linux загружает все файлы .h в режиме C ++ и прекрасно редактирует заголовки C. Кроме того, при смешивании C и C ++ вы можете следовать этому совету .

Мой личный вывод : .cpp / .h - путь наименьшего сопротивления.

Armorix
источник
3

Как другие писали до меня, в конце концов, это то, что используется вашим проектом / командой / компанией.

Лично я не использую ccрасширение, я пытаюсь уменьшить количество расширений и не увеличивать их, если нет явного значения (по моему мнению).

Для чего это стоит, это то, что я использую :

c - Только чистый C-код, без классов или структур с методами.

cpp - код C ++

hpp- Заголовок только код. Реализации находятся в заголовках (как классы шаблона)

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

TCS
источник