Dlaczego ktoś miałby używać C zamiast C ++? [Zamknięte]


135

Chociaż wydaje się, że ludzie lubią narzekać na C ++, nie byłem w stanie znaleźć wielu dowodów na to, dlaczego chciałbyś wybrać C zamiast C ++. Wydaje się, że C nie ma prawie tak wielu błędów, a jeśli C ++ ma wszystkie te problemy, dlaczego nie możesz po prostu ograniczyć się do podzbioru C? Jakie są Twoje myśli / doświadczenia?


dokładny duplikat linku już nie działa ..... mówi facet, który spóźnił się na imprezę c :)
kyle

4
C jest naprawdę lepszy i prostszy niż C ++, ale każdy programista C może przekonwertować C ++ na C i śmiać się.
BobRun

12
Przerażające jest to, że ludzie ogólnie myślą, że „++” oznacza, że ​​to jest naprawdę dobre, przepraszam, że nie.
BobRun

Pomijając oczywiste - małe / wbudowane urządzenia - ogólnie C jest lepsze w przypadku problemów związanych z przetwarzaniem samych liczb (np. Przetwarzanie grafiki GPU, masowo równoległe obliczenia fizyczne, eksploracja wzorców itp.), Gdzie funkcje OOP są zbyt duże. C ++ jest lepszy do modelowania systemów, w których „rzeczy” współdziałają, znacznie łatwiejsze dzięki możliwościom OOP.
Paceman

3
Ponieważ JavaScript, najlepsze praktyki, c ++ i OOP są głupie / zbyt zajęte próbami rozwiązywania tych abstrakcyjnych problemów, które prawdopodobnie tak naprawdę nie istnieją lub muszą nigdy zostać rozwiązane.
statek marszałkowy

Odpowiedzi:


133

Odpowiedź Joela jest dobra z powodów, dla których być może będziesz musiał użyć C, chociaż jest kilka innych:

  • Musisz przestrzegać wytycznych branżowych, które są łatwiejsze do udowodnienia i przetestowania w C.
  • Masz narzędzia do pracy z C, ale nie C ++ (myśl nie tylko o kompilatorze, ale o wszystkich narzędziach pomocniczych, pokryciu, analizie itp.)
  • Twoi docelowi programiści to guru C.
  • Piszesz sterowniki, jądra lub inny kod niskiego poziomu
  • Wiesz, że kompilator C ++ nie jest dobry w optymalizacji rodzaju kodu, który musisz napisać
  • Twoja aplikacja nie tylko nie jest zorientowana obiektowo, ale byłaby trudniejsza do napisania w takiej formie

Jednak w niektórych przypadkach możesz chcieć użyć C zamiast C ++:

  • Chcesz wydajności asemblera bez kłopotów z kodowaniem w asemblerze (C ++ jest teoretycznie zdolny do `` doskonałej '' wydajności, ale kompilatory nie są tak dobre w dostrzeganiu optymalizacji, które zobaczy dobry programista C)
  • Oprogramowanie, które piszesz, jest trywialne lub prawie takie - wyciągnij mały kompilator C, napisz kilka linijek kodu, skompiluj i gotowe - nie ma potrzeby otwierania ogromnego edytora z pomocnikami, nie ma potrzeby pisania praktycznie puste i bezużyteczne klasy, zajmują się przestrzeniami nazw itp. Możesz zrobić prawie to samo z kompilatorem C ++ i po prostu użyć podzbioru C, ale kompilator C ++ jest wolniejszy, nawet dla małych programów.
  • Potrzebujesz ekstremalnej wydajności lub małego rozmiaru kodu i wiesz, że kompilator C ++ będzie faktycznie trudniejszy do wykonania ze względu na rozmiar i wydajność bibliotek

Twierdzisz, że możesz po prostu użyć podzbioru C i skompilować za pomocą kompilatora C ++, ale przekonasz się, że jeśli to zrobisz, otrzymasz nieco inne wyniki w zależności od kompilatora.

Niezależnie od tego, jeśli to robisz, używasz C. Czy twoje pytanie naprawdę brzmi „Dlaczego programiści C nie używają kompilatorów C ++?” Jeśli tak, to albo nie rozumiesz różnic językowych, albo nie rozumiesz teorii kompilatora.


2
Istnieje również standard MISRA C, który AFAIK nie jest jeszcze stabilny dla C ++.
Paul Nathan

61
Część dotycząca wydajności niekoniecznie jest prawdziwa. Istnieje wiele obszarów, w których C ++ może optymalizować znacznie lepiej niż C. (Oczywiście czasami jest też odwrotnie, ale generalnie wybór C zamiast C ++ ze względu na wydajność jest złym pomysłem).
jalf

10
Chciałbym uzyskać więcej informacji o wydajności. Nie rozumiem, dlaczego C tylko „od czasu do czasu” działałby lepiej. Biorąc pod uwagę przeciętnego programistę, może się zdarzyć, że C ++ ułatwia osiągnięcie wydajności (dobre wykorzystanie wzorców), ale program w C napisany przez eksperta powinien być szybszy - mniejszy narzut.
Adam Davis

3
Oczywiście, pisanie i debugowanie szybszego programu w C zajęłoby więcej czasu, więc jest to kompromis, a biorąc pod uwagę szybkość maszyn, kompromis rzadko jest tego warty, z wyjątkiem wyspecjalizowanych aplikacji, dlatego C ++ jest ogólnie lepszy. (do czasu ukończenia kodu komputery są szybsze i zjadają różnicę)
Adam Davis

21
@Adam: C ++ działa lepiej niż C z „ładnym” kodem. C ++ może używać szablonów i funkcji wbudowanych, w których C potrzebuje makra. Narzut C ++ pojawia się tylko wtedy, gdy zostaniesz o to poproszony, poza tym jest taki sam jak C. (virtual, try / throw, dynamic_cast). Duża część kosztów ogólnych jest widoczna tylko w rozmiarze obrazu programu.
Zan Lynx

95

Lubię minimalizm i prostotę.


9
OK - w porządku ... więc dlaczego nie Forth?
Jonathan Leffler

15
Sądzę, że lubi też mieć dostępne biblioteki, książki, fora?
gnud

34
Podoba mi się minimalizm i prostota Twojej odpowiedzi ... :)
Joe DF

8
Zgodzić się. C jest bardzo proste i „małe”. C zawsze wygląda tak samo, a jeśli jesteś nowym współtwórcą projektu, łatwo jest zrozumieć, jak to działa. c ++ ma wiele bezużytecznych rzeczy i kiedy patrzę na projekt c ++, od razu się mylę. Rozumiem ludzi C ++ (język C z funkcjami OO), ale C jest po prostu prostsze i łatwiejsze.
user69969,

1
Uważam również, że C jest znacznie lepiej przystosowanym językiem do pisania niektórych rodzajów bibliotek, takich jak małe biblioteki uniwersalne, języki skryptowe i, tak, silniki renderujące.
keebus

65
  • Ponieważ znają już C.
  • Ponieważ budują osadzoną aplikację dla platformy, która ma tylko kompilator C.
  • Ponieważ utrzymują starsze oprogramowanie napisane w C
  • Piszesz coś na poziomie systemu operacyjnego, silnika relacyjnej bazy danych lub detalicznego silnika gier wideo 3D.

4
Niektóre mikrokontrolery mają tylko kompilatory C, które naprawdę są do bani. Podstawowe cechy C ++ (przestrzenie nazw, klasy poza funkcjami wirtualnymi, wyliczenia, deklarowanie zmiennych w innych miejscach poza wierzchołkiem bloku) są najbardziej wartościowe, IMHO.
Jason S

2
Z tego wynika, że ​​wybrałbyś C tylko wtedy, gdy nie ma rozsądnych alternatyw.

2
@Joe: pomijając pierwszy punkt, to podsumowuje. Wiele późniejszych języków przyjęło C i powiedziało: „hej, możemy zrobić lepiej ”.
Joel Coehoorn

1
Zgoda. Jeśli nie używasz wyrafinowanych funkcji C ++, uważam, że C ++ jest monotonnie lepszym C. Z bardziej wyrafinowanymi funkcjami C ++, sprawy stają się bardziej dyskusyjne, ale wtedy debata dotyczy zwykle wyższego poziomu abstrakcji - np. Java.
Paul Nathan

4
W rzeczywistości większość silników gier 3D używa języka C ++. UE4 używa głównie C ++.
Aditya Kashi

57

Obawy przed wydajnością lub rozdęciem nie są wystarczającym powodem, aby zrezygnować z C ++. Każdy język ma swoje potencjalne pułapki i kompromisy - dobrzy programiści dowiadują się o nich i tam, gdzie to konieczne, opracowują strategie radzenia sobie, biedni programiści upadną i obwiniają język.

Interpretowany Python jest pod wieloma względami uważany za „wolny” język, ale w przypadku nietrywialnych zadań wykwalifikowany programista Pythona może z łatwością stworzyć kod, który będzie wykonywany szybciej niż niedoświadczony programista w C.

W mojej branży gier wideo piszemy kod o wysokiej wydajności w C ++, unikając rzeczy takich jak RTTI, wyjątki lub funkcje wirtualne w pętlach wewnętrznych. Mogą być niezwykle przydatne, ale powodują problemy z wydajnością lub wzdęciami, których należy unikać. Gdybyśmy mieli pójść o krok dalej i całkowicie przejść na C, niewiele zyskalibyśmy i stracilibyśmy najbardziej przydatne konstrukcje C ++.

Największym praktycznym powodem preferowania C jest to, że obsługa jest bardziej rozpowszechniona niż C ++. Istnieje wiele platform, szczególnie osadzonych, które nie mają nawet kompilatorów C ++.

Jest też kwestia kompatybilności dla dostawców. Chociaż C ma stabilny i dobrze zdefiniowany ABI (Application Binary Interface), C ++ nie. ABI w C ++ jest bardziej skomplikowane z powodu takich rzeczy jak vtables i konstruktorzy / destruktory, więc jest implementowany inaczej dla każdego dostawcy, a nawet wersji łańcucha narzędzi dostawcy.

W rzeczywistości oznacza to, że nie można wziąć biblioteki wygenerowanej przez jeden kompilator i połączyć ją z kodem lub biblioteką z innego, co tworzy koszmar dla rozproszonych projektów lub dostawców oprogramowania pośredniego bibliotek binarnych.


7
„Interpretowany Python jest pod wieloma względami uważany za„ wolny ”język, ale w przypadku nietrywialnych zadań wykwalifikowany programista Pythona może z łatwością stworzyć kod, który będzie wykonywany szybciej niż niedoświadczony programista C.” Wydaje mi się, że programista (niekoniecznie Python Progammer), który pobierał lekcje algorytmów, może stworzyć kod, który wykonuje się szybciej niż niedoświadczony programista (ogólnie).
Andrei Ciobanu

15
I ten sam niedoświadczony program c-dev wyprodukuje kod Pythona, który jest wolniejszy niż jego kod c. Python jest znacznie wolniejszy niż c.
Millie Smith

37

Wybieram pisanie w C, ponieważ lubię pracować małym, wąskim językiem. Lubię mieć dostęp do standardu, który można przeczytać w rozsądnym czasie (jak dla mnie - czytam bardzo wolno). Ponadto używam go do pisania oprogramowania dla systemów wbudowanych, dla których istnieje kilka pożądanych kompilatorów C ++ (jak niektóre mikrokontrolery PIC).


re: PICs - czuję twój ból. Jeśli kiedykolwiek będę musiał zrobić dużo kodu PIC, prawdopodobnie użyję kompilatora IAR, który obsługuje C ++. Użyłem go na MSP430 i jest całkiem niezły.
Jason S

1
I nie zapomnij o znacznie poprawionych czasach kompilacji dla C. Brak systemu szablonów.
Inżynier

37

Mam inny pogląd: po co używać C ++ zamiast C?

Książka The C Programming Language (aka: K&R) na mniej niż 300 stronach jasno wyjaśnia, jak zrobić wszystko, co potrafi język. To arcydzieło minimalizmu. Żadna książka C ++ nie jest nawet bliska.

Oczywistym kontrargumentem jest to, że to samo można powiedzieć o większości, jeśli nie o wszystkich, współczesnych językach - nie mogą one również powiedzieć, jak zrobić wszystko na zaledwie kilkuset stronach. Prawdziwe. Dlaczego więc zamiast tego używać C ++? Bogactwo funkcji? Moc? Jeśli potrzebujesz czegoś bardziej bogatego w funkcje lub potężnego, wybierz C #, Objective C, Javę lub coś podobnego. Po co obciążać się złożonością C ++? Jeśli potrzebujesz stopnia kontroli, jaki zapewnia C ++, to twierdzę, że używam C. C może zrobić wszystko i może zrobić to dobrze.


Zgadzam się. Chcę mocy, więc używam czegoś naprawdę potężnego, a nie punktu 1/2.
Dinah

7
@Dinah: punkt 1/2 zapewnia wyższą moc wyrażania bez wydajności i kosztu pamięci C # lub Java.
Zan Lynx,

5
@Zan Lynx: masz rację. Ale mam nadzieję, że przyjmując przeciwne stanowisko, które zrobiłem w moim oryginalnym poście, zwróciłem uwagę na żywotność C w porównaniu z C ++ ... nawet jeśli, jak wskazałeś, nie jest to sprawa otwarta i zamknięta.
Dinah

30

Oprócz kilku innych wspomnianych już punktów:

Mniej zaskoczenia

to znaczy, dużo łatwiej jest zobaczyć, co dokładnie zrobi fragment kodu . W C ++ musisz zbliżyć się do poziomu guru, aby móc dokładnie wiedzieć, jaki kod generuje kompilator (spróbuj kombinacji szablonów, wielokrotnego dziedziczenia, automatycznie generowanych konstruktorów, funkcji wirtualnych i mieszaj w odrobinie magii przestrzeni nazw i wyszukiwania zależnego od argumentów).

W wielu przypadkach ta magia jest fajna, ale na przykład w systemach czasu rzeczywistego może naprawdę zepsuć twój dzień.


28

Odpowiedź Linusa na twoje pytanie brzmi: „Ponieważ C ++ to okropny język”

Jego dowody są w najlepszym razie anegdotyczne, ale ma rację.

Będąc bardziej językiem niskiego poziomu, wolałbyś go od C ++. C ++ to C z dodanymi bibliotekami i obsługą kompilatora dla dodatkowych funkcji ( oba języki mają funkcje, których nie ma w drugim języku i implementują je w inny sposób ), ale jeśli masz czas i doświadczenie z C, możesz skorzystać z dodatkowych mocy związanych z niskim poziomem ... [Edytowano] (ponieważ się przyzwyczajasz do wykonywania większej ilości pracy ręcznie, zamiast korzystać z niektórych uprawnień pochodzących z samego języka / kompilatora)

Dodawanie linków:

Dlaczego C ++ dla osadzonych

Dlaczego nadal używasz C? PDF

Chciałbym google za to .. ponieważ istnieje wiele komentarzy w internecie już


18
Dużo kodowałem w C, potem krótko w C ++, potem żenująco długo z VB, a teraz używam C # od kilku lat. Od tamtej pory napisałem trochę kodu w C i C ++ i zdałem sobie sprawę, że C jest dobrze zdefiniowany i zwarty, C # jest fajny i potężny, a C ++ jest po prostu do bani.
CMPalmer

25
Linus nie ma odpowiednich kwalifikacji, aby mówić o zaletach C ++. Cytując go, jakby był jakąś wyrocznią, jest po prostu głupie. A fragment o „robieniu rzeczy na własnej skórze” nie ma sensu. Są dobre powody, by używać C, ale „to więcej pracy” czy „Linus tak powiedział” nie należą do nich.
jalf

9
@jalf, nie cytując Linusa, jakby był jakąś wyrocznią, dobrze jest wspomnieć opinię znanego programisty na temat jego wyborów w jednym z najczęściej używanych programów na świecie: jądrze Linuksa. Pytanie o opinie (dlaczego ktoś miałby wybrać C) to jest to, na co chciałem odpowiedzieć.
Ric Tokyo

6
Linus jest kiepskim źródłem opinii na temat C ++, ponieważ go nie używa i o ile wiem, próbował go tylko raz w 1990 roku.
Zan Lynx

4
@Zan Linus gdzie indziej wykazał się większą samokontrolą: „Chcielibyśmy użyć C ++ i dodatkowych funkcji, które on przynosi, ale trudniej jest zobaczyć, gdzie jest zły kod w C ++ niż w C”. Cytat z mojej odpowiedzi jest raczej zapisem opinii niż „naśladowaniem lidera”.
Ric Tokyo

27

Przywykłem do używania C ++ w moich projektach. Potem dostałem pracę, w której używany jest zwykły C (20-letni ewoluujący kod oprogramowania antywirusowego z kiepską dokumentacją ...).

Trzy rzeczy, które lubię w C to:

  • Nic nie jest ukryte: widzisz, co dokładnie robi twój program, a czego nie. Ułatwia to debugowanie.

  • Brak przestrzeni nazw i przeciążeń może być zaletą: jeśli chcesz wiedzieć, gdzie wywoływana jest dana funkcja, po prostu przeszukaj katalog kodu źródłowego i powie ci. Żadne inne specjalne narzędzia nie są potrzebne.

  • Odkryłem na nowo siłę wskaźników funkcji. Zasadniczo pozwalają one na wykonywanie wszystkich polimorficznych rzeczy, które robisz w C ++, ale są jeszcze bardziej elastyczne.


8
+1 Jednak taki polimorfizm w C jest zwykle uzyskiwany przez void *, co jest niebezpieczne, ponieważ wyłącza jakąkolwiek zdolność kompilatora do sprawdzenia, czy robisz coś paskudnego.
gd1

5
@ gd1 W praktyce nie pamiętam ani jednego przypadku, kiedy to void* spowodowało kłopoty. Istnieje wiele obronnych technik programowania, które chronią przed błędami: umieszczanie wszędzie potwierdzeń, dodawanie magicznych liczb do struktur (w kompilacjach debugowania) itp. Ale obecnie mamy valgrind, dr. pamięć, a nawet narzędzia MSVC wykorzystują kod do wykrywania problemów, więc problemy z uszkodzeniem pamięci są dość łatwe do rozwiązania.
Calmarius

4
Prawie nigdy nie doświadczam uszkodzenia pamięci w moich programach, ale jeśli to możliwe, wolałbym, aby błędy były wykrywane przed uruchomieniem programu. Przesyłanie void*do whatever*jest czymś, co kompilator akceptuje w dobrej wierze. Wolę, aby mój kompilator mi nie ufał i miał możliwość wymuszania niezawodnych kontroli typów. Błędy podstawiania szablonów wywoływane przez kompilatory C ++ są trudne do odczytania, ale przynajmniej śmieci nie kompilują się.
gd1

1
@ gd1 Wracając do twojego pierwszego komentarza, nie wiem, ile masz doświadczenia z technikami proceduralnymi (widzę, że jesteś aktywny głównie w tagach OO). void*Zazwyczaj można uniknąć. Typowy wzorzec podczas dodawania niestandardowego zachowania przekazuje wskaźnik funkcji i znak void*dla danych użytkownika. Ogólny interfejs zwykle wygląda tak. Następnie biblioteka przekazuje to z void*powrotem do twojego wywołania zwrotnego, nie robiąc z tym nic więcej. Najczęściej nie masz żadnych dodatkowych danych, więc przekazujesz NULL i ignorujesz parametr użytkownika w swoim wywołaniu zwrotnym. Przypuszczałem, że wiesz o tym.
Calmarius

@Calmarius "Najczęściej nie masz żadnych dodatkowych danych" -> To jest właściwie zaleta polimorfizmu. Dodatkowe dane można łatwo powiązać bez używania wskaźników void. Więc twoją wymówką jest po prostu „I tak naprawdę nie używam tej funkcji”.
user2445507

26

Ponieważ piszą wtyczkę, a C ++ nie ma standardowego ABI.


9
Chociaż to prawda, nie jest to przekonujący powód, aby trzymać się języka C, ponieważ możesz wyeksportować niezbędne funkcje za pomocą połączenia C i nadal zachować swoją implementację w C ++.
codelogic

2
@codelogic - projekty C ++ mają tendencję do eksportowania o wiele więcej typów i funkcji niż równoważne projekty w C. Można to ukryć w ostatecznej udostępnianej bibliotece, ale prawdopodobnie jest to więcej wysiłku niż jest to warte.
Tom

tbh niezbyt dobra odpowiedź, ale +1, ponieważ C ++ nie ma standardowego ABI (tak .. C ++ jest do bani)
hasen

6
C również nie ma standardowego ABI.
Stephen Canon,

25

Długie czasy kompilacji mogą być denerwujące. Dzięki C ++ możesz mieć bardzo długie czasy kompilacji (co oczywiście oznacza więcej czasu na przepełnienie stosu!).


Dlaczego głosowanie odrzucono? Sam wykonuję dużo pracy w C ++ i nie wróciłbym do C, ale rzeczywiście może to mieć boleśnie długie czasy kompilacji (na przykład szablony).
Frank

6
Używam C ++ do prawdziwej pracy, ale zawsze tworzę prototypy w C ze względu na prawie natychmiastowe czasy kompilacji.
Tom

Hmm, jeśli zrobimy to we właściwy sposób, tj. Nie mając nadęty, które-możemy-potrzebować-te- # zawiera i nie jest-pewien-który-jest-właściwy-uwzględnij-więc-uwzględnię-je-wszystkie- # obejmuje czasy kompilacji są zadbane. Kiedy włamuję się do jednego lub trzech plików, skompilowanie 100 projektów KLOC zajmuje mi zaledwie 1-2 sekundy.
Sebastian Mach,

4
@Tom: Zastanawiam się, jak wygląda twoja prawdziwa praca w C ++, jeśli potrafisz prototypować w C. Czy nie używasz możliwości C ++? Czy możesz rozwinąć?
Sebastian Mach,

16

Jeśli chcesz, aby Twój kod był zrozumiały praktycznie dla każdego programisty, piszącego w C.


15

Dziwię się, że nikt nie wspomniał o bibliotekach. Wiele języków może łączyć się z bibliotekami C i wywoływać funkcje C (w tym C ++ z zewnętrznym „C”). C ++ jest właściwie jedyną rzeczą, która może używać biblioteki C ++ (zdefiniowanej jako „biblioteka korzystająca z funkcji w C ++, których nie ma w C [takich jak przeciążone funkcje, metody wirtualne, przeciążone operatory…] i nie eksportuje wszystko przez interfejsy kompatybilne z C przez zewnętrzne "C" ').


1
Bynajmniej; możesz wypuścić "C" lub __cdecl swoje funkcje, aby udostępnić je C.
Crashworks,

Świetnie, ale z jakimi innymi językami to działa?
BigSandwich

2
C lib może działać w znacznie większej liczbie miejsc.
BigSandwich

1
Wszystkie, które mogą prowadzić do C.
Crashworks,

2
Najbardziej oczywistym powodem problemów z interoperacyjnością jest zniekształcanie nazw i myślę, że warto o tym poruszyć.
Tom

12

Ponieważ chcą używać funkcji w C99, które nie mają odpowiedników w C ++.


Jednak nie ma tak wielu funkcji C99, które są przydatne w C ++, jak ludzie myślą na pierwszy rzut oka. Tablice o zmiennej długości? C ++ ma std :: vectors. Obsługa liczb zespolonych / urojonych? C ++ ma typ złożony z szablonami. Typowe funkcje matematyczne? C ++ przeciążał standardowe funkcje matematyczne, powodując ten sam wynik.

Nazwane inicjatory? Nie w C ++, ale istnieje obejście:

struct My_class_params {
    int i;
    long j;
    std::string name;

    My_class_params& set_i(int ii)
    {
        i = ii;
        return *this;
    }

    My_class_params& set_j(long jj)
    {
        j = jj;
        return *this;
    }


    template <typename STRING>
    My_class_params& set_name(STRING&& n)
    {
        name = std::forward<STRING>(n);
        return *this;
    }

    My_class_params()
    {
        // set defaults
    }
};

class My_class {
    My_class_params params;
  public:
    My_class(const My_class_params& p) : params(p) { }
    ...
};

Dzięki temu możesz pisać takie rzeczy jak:

My_class mc(My_class_params().set_i(5).set_name("Me"));

Słuchaj, słuchaj! Brak nazwanych wyznaczonych inicjatorów w C ++ prowadzi mnie do ściany za każdym razem, gdy muszę go używać.
ephemient

2
Mam 100% na inicjalizatorach !!!
Sędzia Maygarden

Jeśli chcesz zainicjować globalną strukturę poza funkcją (więc nie możesz .set _ * ()), C ++ zmusza cię do użycia nienazwanej składni inicjującej lub do napisania konstruktora dla twojej struktury. Nie podoba mi się żadna z tych opcji.
ephemient

Istnieją również VLA w C99 (GCC), które są znacznie łatwiejsze w obsłudze niż std:vector.
Vahid Amiri

10

Ponieważ w przypadku wielu zadań programistycznych C jest prostszy i wystarczająco dobry. Kiedy programuję szczególnie lekkie narzędzia, czuję, że C ++ chce, abym zbudował elegancką superstrukturę dla samego siebie, zamiast po prostu pisać kod.

OTOH, w przypadku bardziej złożonych projektów, elegancja zapewnia więcej solidnego rygoru strukturalnego, niż naturalnie wypłynęłoby z mojej klawiatury.


8

Większość istotnych cech języka c ++ w jakiś sposób dotyczy klas lub szablonów. Są to wspaniałe funkcje, z wyjątkiem sposobu, w jaki kompilator przekształca je w kod obiektowy. Większość kompilatorów używa zniekształcania nazw, a te, które nie robią czegoś co najmniej tak nieporządne.

Jeśli Twój system żyje samodzielnie, jak ma to miejsce w przypadku wielu aplikacji, C ++ jest dobrym wyborem.

Jeśli twój system wymaga interakcji z oprogramowaniem, które niekoniecznie jest napisane w C ++ (najczęściej w asemblerze lub bibliotekach Fortran), to jesteś w trudnym położeniu. Aby wchodzić w interakcje z tego rodzaju przypadkami, musisz wyłączyć zniekształcanie nazw dla tych symboli. zwykle odbywa się to poprzez zadeklarowanie tych obiektów extern "C", ale wtedy nie mogą to być szablony, przeciążone funkcje ani klasy. Jeśli najprawdopodobniej będzie to Twój interfejs API aplikacji, musisz otoczyć je funkcjami pomocniczymi i zachować synchronizację tych funkcji z rzeczywistymi implementacjami.

W rzeczywistości język C ++ zapewnia standardową składnię funkcji, które można łatwo zaimplementować w czystym C.

Krótko mówiąc, narzut interoperacyjnego C ++ jest zbyt wysoki, aby większość ludzi mogła to uzasadnić.


3
Jestem bardzo zaskoczony, gdy to słyszę, ponieważ napisałem tak wiele plików .DLL w C ++, które miały zewnętrzne interfejsy "C", więc mogły być wywoływane z C lub dowolnego innego języka CLR. Z pewnością nie można po prostu ujawnić wskaźników funkcji składowych, ale naprawdę nie jest to duży problem z organizacją danych dla wywołania __cdecl.
Crashworks

1
Właściwie możesz wyeksportować kod szablonu. Wymaga po prostu otok funkcji bez szablonów dla każdego typu, którego chcesz użyć, aby uniknąć kolizji nazw.
Sędzia Maygarden

8

To dość płytkie, ale jako zapracowany student wybrałem C, ponieważ sądziłem, że nauka C ++ zajmie zbyt dużo czasu. Wielu profesorów na mojej uczelni nie przyjmuje zleceń w Pythonie i musiałem szybko coś odebrać.


8
Mądrze twoi nauczyciele!
Andrei Ciobanu

6

Jedna uwaga dotycząca „po prostu użyj podzbioru C ++, którego chcesz użyć”: problem z tym pomysłem polega na tym, że wymuszenie, by wszyscy w projekcie używali tego samego podzbioru, wiąże się z kosztami. Osobiście uważam, że te koszty są dość wysokie w przypadku projektów luźno powiązanych (np. Open source), a także, że C ++ całkowicie zawiódł w byciu lepszym C, w tym sensie, że nie można używać C ++ wszędzie tam, gdzie używałeś C.


6

Ojej, C vs C ++, świetny sposób na rozpoczęcie wojny o płomienie. :)

Myślę, że C jest lepsze dla sterownika i kodu osadzonego.

C ++ ma kilka wspaniałych funkcji, których nie ma w C, ale wiele zorientowanych obiektowo funkcji C ++ może powodować olbrzymie błędy w kodowaniu, gdy ludzie piszą kod z nieoczywistymi efektami ubocznymi, które pojawiają się za kulisami. Szalony kod można ukryć w konstruktorach, destruktorach, funkcjach wirtualnych, ... Piękno kodu C polega na tym, że język nie robi nic nieoczywistego za plecami, dzięki czemu możesz czytać kod i nie musisz patrzeć na każdego konstruktora i destruktora i tak dalej. Dużym problemem są złe praktyki kodowania przez NIEKTÓRE osoby.

Moim idealnym językiem byłoby połączenie C99 z minimalnym podzbiorem bezpieczniejszych możliwości C ++, które dodają ZERO (lub prawie zero) narzut kompilatora do wyjścia binarnego. Idealnym dodatkiem byłoby hermetyzacja klas i koncepcje nazewnictwa danych i funkcji.


Nazwij to C + lub C100: _)
m3nda

4

Nie byłem w stanie znaleźć wielu dowodów na to, dlaczego chcesz wybrać C zamiast C ++.

Trudno nazwać to, co mam zamiar powiedzieć, dowodem; to tylko moja opinia.

Ludzie lubią C, ponieważ ładnie mieści się w umyśle programisty.

Istnieje wiele skomplikowanych reguł C ++ [kiedy potrzebujesz wirtualnych destruktorów, kiedy możesz wywoływać wirtualne metody w konstruktorze, jak przeciążanie i nadpisywanie interakcji, ...], a opanowanie ich wszystkich wymaga wiele wysiłku. Ponadto, między odwołaniami, przeciążaniem operatorów i przeciążaniem funkcji, zrozumienie fragmentu kodu może wymagać zrozumienia innego kodu, który może być łatwy do znalezienia lub nie.

Inne pytanie, dlaczego organizacje wolą C od C ++. Nie wiem, jestem tylko ludem ;-)

W obronie C ++ wnosi cenne funkcje do tabeli; najbardziej cenię jednak polimorfizm parametryczny (ish): operacje i typy, które przyjmują jeden lub więcej typów jako argumenty.


2
++score: Twoje stwierdzenie „Ludzie lubią C, ponieważ ładnie mieści się w umyśle programisty” jest bardzo ładnie wyrażone. Możliwość programowania w prostym języku, w którym wiesz, że to, co widzisz, jest naprawdę atrakcyjną właściwością dla języka programowania.
tchrist

3

Powiedziałbym, że C daje lepszą kontrolę nad optymalizacją i wydajnością niż C ++ i dlatego byłoby przydatne w sytuacjach, gdy pamięć i inne zasoby są ograniczone, a każda optymalizacja pomaga. Oczywiście ma również mniejszy ślad.


Czy możesz podać przykłady?
Andrew Grant

Tak więc ten sam kod C skompilowany przy użyciu kompilatora C będzie bardziej wydajny, niż gdyby został skompilowany przy użyciu kompilatora C ++?
Steve Kuo

1
Lata temu jądro Linuksa można było skompilować za pomocą gcc lub g ++, ale g ++ stworzył wolniejszy kod ( tux.org/lkml/#s15-3 w sekcji „Wreszcie, podczas gdy Linus utrzymuje jądro programistyczne ...”).
Max Lybbert

Przypuszczam, że myślałem bardziej w kategoriach możliwości kontrolowania większej ilości optymalizacji kodu w C nad C ++. Podobnie jak programista używający języka asemblera może precyzyjniej dostroić swój kod niż programista używający języka wyższego poziomu.
Chris

2

Niektóre sklepy stosują również podejście polegające na używaniu niektórych funkcji C ++ w sposób podobny do C, ale unikanie tych, które są niepożądane. Na przykład, używanie klas i metod klas oraz przeciążanie funkcji (które są zwykle łatwe do radzenia sobie nawet dla twardogłowych C), ale nie STL, operatory strumieniowe i Boost (które są trudniejsze do nauczenia i mogą mieć złą charakterystykę pamięci).


1

Ponieważ piszesz dla systemu, w którym zasoby są ograniczone (na przykład system wbudowany lub jakiś prawdziwy kod, taki jak jądro) i chcesz, aby narzut był jak najmniejszy.

Jest powód, dla którego większość systemów wbudowanych nie ma kompilatora C ++ - nie chodzi o to, że ludzie go nie chcą, chodzi o to, że upychanie kodu C ++ w tak małej przestrzeni jest zadaniem, które jest prawie niemożliwe.


3
Nie jest to tak naprawdę problem samego C ++ jako języka, ale patologiczny wzdęcia, które może spowodować bezkrytyczne używanie szablonów.
Crashworks

1
ecos jest w dużej mierze napisane w C ++. Nie ma związku między językiem (w porównaniu do C) a rozmiarem pliku wykonywalnego (o ile wiesz, jakich funkcji użyć).
user52875

1
„o ile wiesz, jakich funkcji użyć”. O to właśnie chodzi - rezultatem stwierdzenia „cóż, mamy C ++, ale nie możemy obsługiwać połowy funkcji językowych z powodów ogólnych” jest Symbian / C ++, który dezorientuje i złości zarówno programistów C, jak i programistów C ++ ...
Steve Jessop

1
Uzgodnione we wszystkich punktach. Naszym rozwiązaniem, aby „wiedzieć, jakich funkcji użyć”, było po prostu użycie kompilatora C i nazwanie tego jednym dniem. Jasne, mogliśmy sprawić, by C ++ działał (co byłoby naprawdę fajne w trochę super-nerdowskim stylu), ale mieliśmy produkt do wysłania i nie mieliśmy czasu, aby się nim martwić.
Electrons_Ahoy

1

C potrzebował lepszego preprocesora. cfront był jednym i tak powstał c ++

Użyję C, gdzie „c ++ jako preprocesor” nie byłoby w porządku.

Jestem prawie pewien, że na dole każdej dobrze napisanej biblioteki / frameworka / zestawu narzędzi c ++ można znaleźć dirty-old-c (lub rzuty statyczne, które są takie same)


0
  • Jeszcze kilka lat temu istniejącym kompilatorom C ++ brakowało ważnych funkcji lub wsparcie było słabe, a obsługiwane funkcje znacznie się różniły, więc trudno było pisać aplikacje przenośne.
  • Ze względu na brak standardowego nazewnictwa symboli, innym językom / aplikacjom jest trudno bezpośrednio obsługiwać klasy C ++.
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.