Rozszerzenie pliku kodu C ++? .cc vs .cpp [zamknięte]


599

Widziałem kod C ++ zapisany jako pliki .cci .cpp. Czy jest jakaś różnica między nimi?

Przewodnik po stylu Google wydaje się sugerować .cc, ale nie zawiera wyjaśnień.

Zajmuję się głównie programami w systemach Linux.


85
Wniosek To nie ma znaczenia. Możliwe pochodzenie cc = C z klasami, cpp = C plus plus
Lazer

6
Ważne jest, aby clang ++. Gdy podasz mu plik nagłówkowy C ++ o nazwie kończącej się na .h, clang ++ ostrzega.
allyourcode

4
Kolejnym narzędziem, które trochę mnie obchodzi, jest emacs. Przy czystej konfiguracji .emacs otwieranie („wyszukiwanie” w języku emacs) plik .h aktywuje tryb c, a nie tryb c ++. Oczywiście możesz skonfigurować emacsa, aby robił coś innego (jak wszystko w emacsie), ale chodzi mi o to, że tryb c jest domyślnym ustawieniem domyślnym.
allyourcode

3
lintobchodzi, .Cto C ++ i .cC bez żadnego zrozumienia .cclub .cpp. Przynajmniej w systemie AIX 6.1.
Jesse Chisholm,

5
Odpowiedź „to nie ma znaczenia” tak naprawdę nie pomaga. Pytanie jest całkowicie aktualne. OP szukał solidnej konwencji, której mógłby się trzymać. Lepszą odpowiedzią byłoby: „Niestety, społeczność C ++ nie ma solidnej konwencji w tej sprawie”. To smutne, jeśli się nad tym zastanowić. Wszystkie inne popularne języki wydają się mieć jedno, unikalne rozszerzenie pliku. Trzymałbym się tego, czego używa ważny projekt, np. Gcc. Używają.cc .
Lucio Paiva,

Odpowiedzi:


703

Na koniec dnia nie ma to znaczenia, ponieważ kompilatory C ++ radzą sobie z plikami w dowolnym formacie. Jeśli to poważny problem w zespole, rzuć monetą i przejdź do właściwej pracy.


88
Cóż, to jest poprawny punkt, ale nie odpowiada na pytanie użytkownika.
vikrantt

319
CC jest szybszy do pisania
Thang

49
Dlaczego jest to akceptowana odpowiedź? Nowszy programista nie będzie wiedział, że to nie ma znaczenia i zasługują na prostą odpowiedź.
Robben_Ford_Fan_boy

13
Odpowiedź jest absolutnie niewystarczająca dla ciekawskiego i uważnego programisty. Chciałbym uzyskać odpowiedź na tej stronie, ponieważ zawiera ona bardziej szczegółowe wyjaśnienia.
Novin Shahroudi

2
Jeśli weźmie się pod uwagę, że kompilator nie jest zwykle jedynym zaangażowanym narzędziem - prawie zawsze istnieje „make” lub podobne narzędzie, które BĘDZIE dbać o to, jakich rozszerzeń używasz, aby dopasować reguły kompilacji - wtedy ta odpowiedź tak naprawdę nie dotyczy rdzenia obawy dotyczące pytania. Pamiętaj, że istnieją różnice w zależności od systemu i zestawu narzędzi (w tym twoich ulubionych reguł tworzenia itp.), Które będą miały wpływ na decyzję. Na przykład domyślny rekurencyjny system kompilacji z wieloma celami, niektóre z serii platform programistycznych QNX 6 nie pobierają plików * .cpp jako źródeł języka C ++; chce .cc
JoGusto

296

GNU GCC rozpoznaje wszystkie z poniższych postaci plików C ++ i C ++ użyje kompilacja niezależnie od tego, czy podniesienie go przez gcc lub g ++: .C, .cc, .cpp, .CPP, .c++, .cp, lub .cxx.

Uwaga .C- w GCC sprawa ma znaczenie, .cjest to plik C, podczas gdy .Cjest to plik C ++ (jeśli pozwolisz kompilatorowi zdecydować, co to jest kompilacja).

GCC obsługuje także inne sufiksy wskazujące na specjalną obsługę, na przykład .iiplik zostanie skompilowany jako C ++, ale nie wstępnie przetworzony (przeznaczony dla osobno wstępnie przetworzonego kodu). Wszystkie rozpoznane sufiksy są wyszczególnione na gcc.gnu.org


5
„wielkość liter ma znaczenie w GCC” - co z Windows (ponieważ nie rozróżnia wielkości liter)?
Devesh Khandelwal,

17
@Devesh: Windows też. Ale system operacyjny zapobiegnie posiadaniu dwóch plików w folderze rozróżnianych tylko według wielkości liter.
Clifford,

23
@DeveshKhandelwal Ale zachowuje
wielkość liter

229

Świetna rada, której użyć dla makefile i innych narzędzi, biorąc pod uwagę narzędzia inne niż kompilator przy podejmowaniu decyzji, które rozszerzenie do użycia jest świetnym podejściem, aby pomóc znaleźć odpowiedź, która będzie dla Ciebie odpowiednia.

Chciałem tylko dodać następujące informacje, aby pomóc w znalezieniu niektórych informacji .ccvs. .cppOto rozszerzenia w podziale na różne środowiska (z książki „C ++ Primer Plus”):

Unix zastosowania: .C, .cc, .cxx,.c

GNU C ++ zastosowania: .C, .cc, .cxx, .cpp,.c++

Cyfrowy Mars zastosowania: .cpp,.cxx

Borland C ++ używa: .cpp

Watcom używa: .cpp

Microsoft Visual C ++ zastosowania: .cpp, .cxx,.cc

Metrowerks CodeWarrior zastosowania: .cpp, .cp, .cc, .cxx,.c++

Różne środowiska obsługują różne rozszerzenia. Ja też szukałem odpowiedzi na to pytanie i znalazłem ten post. Opierając się na tym poście, myślę, że mogę pójść za .hppi .cppdla ułatwienia rozpoznawania różnych platform / narzędzi.


5
Ta odpowiedź jest najbliższa niż inne w naprawdę próbach rozwiązania postawionego pytania, które dotyczy kogoś, kto szuka solidnej konwencji, której należy się trzymać. Inne języki mają to, ale jeśli chodzi o rozszerzenie pliku, C ++ wydaje się, że go brakuje.
Lucio Paiva,

6
W jakim sensie Unix nie używa .cpp?
Keith Thompson,

Wersja vc ++ 6.0 nie obsługuje plików .cc.
xus

@KeithThompson cehck odpowiedź użytkownika user181548
Spyros Mourelatos

@SpyrosMourelatos Tak, ale nadal jest tak, że kod C ++ w systemach uniksowych bardzo często używa .cppplików źródłowych C ++. (W cytowanej odpowiedzi zaznaczono, że „cpp” jest skrótem od preprocesora C.)
Keith Thompson

78

.cppjest zalecane rozszerzenie dla C ++, o ile wiem. Niektóre osoby zalecają nawet używanie .hppnagłówków C ++, aby odróżnić je od C.

Mimo że kompilator nie dba o to, co robisz, jest to osobiste preferencje.


60
Zdecydowałem się przejść z używania .h na używanie .hpp dla nagłówków c ++; przede wszystkim dlatego, że inne narzędzia, takie jak edytory, również muszą wiedzieć - dodatkowo, gdy używasz prekompilowanych nagłówków z gcc, domyślnie używa C dla plików .h i C ++ dla plików .hpp, chyba że użyjesz opcji '-x c ++ - header' podczas wstępnej kompilacji plik .h.
jdkoftinoff

5
@jd. Zgoda. To sprawia, że ​​zautomatyzowane narzędzia są nieco łatwiejsze, jeśli pliki h / c zamieniają się w pliki hpp / cpp.
Paul Nathan

4
g ++ nie rozpoznaje .hpp jako nagłówka C ++ (do prekompilacji nagłówka), ale .hh tak. Z tego powodu skończyłem używać .cc / .hh nad .cpp / .hpp, ponieważ tak naprawdę nie ma żadnej prawdziwej różnicy.
Tronic,


3
@CharlesAddis - Tak, musiałem przekonwertować dużo kodu, który zawierał „abcd.H” (interfejs c ++) i „abcd.h” (interfejs C) w tym samym katalogu na „abcd.hpp” i „abcd.h ”, ponieważ samo wykonanie„ svn co ”lub rozpakowanie do skrzynki Windows lub Mac OS X (z domyślnym systemem plików) nie powiedzie się z powodu„ duplikatów nazw plików ”
jdkoftinoff 28.09.2013

37

Osobiście używam .ccrozszerzenia do plików implementacyjnych, .hhdo nagłówków i .inldo wbudowanych / szablonów.

Jak powiedziano wcześniej, jest to głównie kwestia gustu.

Z tego, co widziałem , .ccwydaje się być bardziej „ zorientowany na projekty open source ”, jak to jest zalecane w niektórych świetnych stylach kodowania oprogramowania open source, podczas gdy. cppwydaje się bardziej oknoowy.

--- EDYTOWAĆ

Jak wspomniano, jest to „z tego, co widziałem” , może być źle. Po prostu wykorzystałem wszystkie projekty Windows, nad którymi pracowałem .cpp, i wiele projektów typu open source (głównie na systemach uniksowych) .cc.

Przykłady stylów kodowania przy użyciu .cc:


1
czy masz na to odniesienia? Nigdy nie widziałem OSS .cc vs Windows .cpp
bobby

6
Visual Studio tworzy pliki .cpp dla C ++. Nie znam za tym historii.
Natan Yellin

7
LLVM Coding Standard wydaje się opowiadać się za .cpp / .h i umieszczaniem -*- C++ -*-znaczników w nagłówkach llvm.org/docs/CodingStandards.html ; Styl kodowania Mozilli sugeruje .cpp / .h developer.mozilla.org/en-US/docs/Mozilla/Developer_guide/… ; Wydaje się, że KDE używa .cpp / .h zbyt szybkigit.kde.org
sastanin

19

Inne używane rozszerzenia plików to .cxxi .C(wielkie C). Wierzę, że .Cpierwotnie używał Bjarne Stroustrup . .cppto nazwa preprocesora C, więc niefortunnie jest, że był on również używany w C ++.


13

Inną opcją jest miejsce, .cxxgdzie xma być plus obrócony o 45 °.

Obsługiwane są systemy Windows, Mac i Linux, .c++więc powinniśmy z tego skorzystać.


12

Kilka osób mówi, że .ccnic nie znaczy? Może. C ++ zaczął życie jako „C with Classes”.

Prawda, że .cc a .cpptakże nazwy poleceń w większości systemów uniksowych (odpowiednio kompilator c i preprocesor c).

Używam .cppwyłącznie, ale zacząłem na Windowsie. .ccjest bardziej konwencją uniksową, chociaż coraz mniej ją tam widzę. GNU make ma reguły, .cppwięc jest to prawdopodobnie preferowane, będzie domyślnie działać zarówno w systemie Windows, jak i we wszystkich innych. Z drugiej strony nowoczesne C ++ w ogóle nie używa rozszerzenia dla nagłówków, naprawdę tego nie lubię. Wszystkie moje projekty używają .hplików nagłówkowych i obsługują zarówno C, jak i C ++ w jak największym stopniu poprzez extern "C"i testowanie __cplusplus.


2
czy nie powinno to być .cwc? :)
Joshua

Zanim wiele kompilatorów obsługiwało przestrzenie nazw, używały również rozszerzenia .h dla standardowych nagłówków. Zwykle kompilatory udostępniają przestarzałe wersje .h, które umieszczają bibliotekę w globalnej przestrzeni nazw. Umożliwia to obsługę starszego kodu. Czytałem kiedyś gdzieś, że nie mają rozszerzeń .h, ponieważ standard pozwala im nie być plikami, ale w zasadzie „wbudowanymi”. Może to jednak być apokryficzne.
Clifford,


11

Osobiście nigdy nie widziałem .cc w żadnym projekcie, nad którym pracowałem, ale pod względem technicznym kompilatora to nie obchodzi.

Dbają o to programiści pracujący na Twoim źródle, więc moją podstawową zasadą jest dostosowanie się do tego, co czuje twój zespół. Jeśli twój „zespół” jest społecznością typu open source, wybierz coś bardzo powszechnego, z czego .cppwydaje się być ulubionym.


Kilka znanych projektów, takich jak github.com/google/googletest, wykorzystuje .ccjako rozszerzenie plików implementacji C ++
Vertexwahn

10

Podobnie jak w przypadku większości konwencji stylu, ważne są tylko dwie rzeczy:

  1. Zachowaj spójność w zakresie korzystania, tam gdzie to możliwe.
  2. Nie projektuj niczego, co zależy od zastosowanego konkretnego wyboru.

Może się to wydawać sprzeczne, ale każdy z nich ma wartość z własnych powodów.


8

.Ci .ccwydają się być standardem dla (kilku) zorientowanych na Uniksa programów C ++, które widziałem. Zawsze używałem .cppsamego siebie, ponieważ naprawdę pracuję tylko w systemie Windows, a to jest standard tam od zawsze.

Polecam .cpposobiście, ponieważ ... oznacza „C Plus Plus”. Oczywiście bardzo ważne jest, aby rozszerzenia plików były akronimami, ale jeśli to uzasadnienie okaże się niewystarczająco przekonujące, innymi ważnymi rzeczami są niestosowanie klawisza Shift (który wyklucza .Ci .c++) oraz unikanie metaznaków wyrażeń regularnych tam, gdzie to możliwe (co wyklucza .c++- niestety nie da się tego uniknąć ..).

To nie wyklucza .cc, więc nawet jeśli tak naprawdę nic nie oznacza (czy robi to?), To prawdopodobnie jest dobrym wyborem dla kodu zorientowanego na Linuksa.


2
Ale „cpp” może również oznaczać „preprocesor C”. W rzeczywistości program „cpp” w twoim systemie jest najprawdopodobniej preprocesorem C ...
Jesper,

8

Używam .C i .h odpowiednio dla źródła i nagłówka. Jedną fajną rzeczą przy tym wyborze jest to, że w wierszu poleceń można łatwo *.[Ch]wybrać wszystkie pliki kodu. Używanie .Cmoże być problemem w systemach plików bez rozróżniania wielkości liter, ale jeśli masz foo.ci znajduje się foo.Cw tym samym katalogu, zasługujesz na to, co dostajesz :)


8

Rozszerzenie .cc jest niezbędne do korzystania z reguł niejawnych w plikach makefiles. Przejrzyj te linki, aby lepiej zrozumieć pliki makefile, ale spójrz głównie na drugi, ponieważ wyraźnie mówi o przydatności rozszerzenia .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

Właśnie się o tym dowiedziałem.


Znowu są to tylko .cpppliki. Bez obaw ! :-)
Tom Taylor

1
Mówi: „Zachęcamy do używania sufiksu„ .cc ”dla plików źródłowych C ++ zamiast„ .C ”.” Podejrzewam, że to po prostu kiepskie sformułowanie. Używanie .Cmoże być problematyczne w systemach z systemami plików bez rozróżniania wielkości liter. Nie sądzę, że istnieje jakaś szczególna zaleta, o ile makedotyczy, w użyciu .ccprzez .cpp, na przykład. .cppPliki Makefile działają dobrze z plikami źródłowymi C ++.
Keith Thompson,

7

Nie ma znaczenia, którego rozszerzenia użyjesz. Wybierz cokolwiek bardziej lubisz, zachowaj spójność z nazywaniem. Jedyny wyjątek, o którym wiem z tą konwencją nazewnictwa, to to, że nie mogłem WinDDK(lub jest to WDKteraz?) Kompilować .ccplików. W systemie Linux nie stanowi to jednak problemu.


6

Zaczynam nowy projekt w C ++ i zacząłem szukać najnowszych w stylu C ++. Skończyło się tutaj na nazwach plików i pomyślałem, że podzielę się tym, jak wymyśliłem swój wybór. Tutaj idzie:

Stroustrup postrzega to bardziej jako kwestię biznesową niż techniczną .

Postępując zgodnie z jego radą, sprawdźmy, czego oczekują łańcuchy narzędzi.

W systemach UNIX / Linux możesz interpretować następujące domyślne reguły tworzenia GNU jako faworyzujące przyrostek nazw plików .cc, ponieważ reguły .cpp i .C to tylko aliasy:

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

(Uwaga: nie ma domyślnego aliasu COMPILE.cxx)

Więc jeśli celujesz w UNIX / Linux, zarówno .cc, jak i .cpp są bardzo dobrymi opcjami.

Podczas celowania w system Windows szukasz problemów z .C, ponieważ jego system plików nie rozróżnia wielkości liter. I może być ważne, aby pamiętać, że Visual Studio preferuje sufiks .cpp

Podczas celowania w macOS należy pamiętać, że Xcode woli .cpp / .hpp (właśnie zaznaczone na Xcode 10.1). Zawsze możesz zmienić szablon nagłówka na .h.

Za to, co jest warte, możesz również oprzeć swoją decyzję na podstawie kodu, który ci się podoba. Google używa .cc a LLVM libc ++ używa .cpp.

Co z plikami nagłówkowymi? Są one kompilowane w kontekście pliku C lub C ++, więc nie ma żadnego kompilatora ani systemu kompilacji, aby odróżnić .h od .hpp. Podświetlanie składni i automatyczne wcięcia przez edytor / IDE mogą jednak stanowić problem, ale rozwiązuje się to poprzez powiązanie wszystkich plików .h z trybem C ++. Jako przykład, moja konfiguracja emacsa w systemie Linux ładuje wszystkie pliki .h w trybie C ++ i edytuje nagłówki C w porządku. Poza tym, mieszając C i C ++, możesz postępować zgodnie z tą radą .

Mój osobisty wniosek : .cpp / .h to ścieżka najmniejszego oporu.


3

Jak inni pisali przede mną, na końcu jest to, z czego korzysta twój projekt / zespół / firma.

Osobiście nie używam cc rozszerzenia, staram się obniżyć liczbę rozszerzeń i nie zwiększać ich, chyba że istnieje wyraźna wartość (moim zdaniem).

Do tego, co jest tego warte, używam :

c - Tylko czysty kod C, bez klas i struktur z metodami.

cpp - kod C ++

hpp- Kod tylko nagłówki. Implementacje znajdują się w nagłówkach (np. Klasy szablonów)

h- pliki nagłówkowe dla obu C / C ++. Zgadzam się, że można wprowadzić inne rozróżnienie, ale jak napisałem, staram się zmniejszyć liczbę rozszerzeń dla uproszczenia. Przynajmniej z projektów C ++, w których pracowałem, hpliki dla czystego C są rzadsze, dlatego nie chciałem dodawać kolejnego rozszerzenia.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.