Sollte ich den Begriff C / C ++ nicht mehr verwenden?


140

Ich verstehe, dass C und C ++ verschiedene Sprachen sind, aber als ich C ++ lernte, wurde mir immer gesagt, dass C eine Teilmenge von C ++ ist oder C ++ C mit Klassen ist. Und das war bis zum Erscheinen von C ++ x0, C ++ 11 (oder dem modernen C ++ 11/14/17 im Allgemeinen) ganz richtig. Tatsächlich (insbesondere bei eingebetteten Systemen) ist es sehr wahrscheinlich, dass in C ++ geschriebener Code gefunden wird, aber viele Teile vollständig in reiner C-Sprache geschrieben sind. Hier habe ich mehrere Fragen:

  1. Sollte ich den Begriff C / C ++ nicht mehr verwenden?
  2. Wenn die Antwort auf # 1 Ja lautet, wie würde ich ein Programm aufrufen, das eine Mischung aus C und C ++ verwendet?
  3. Angesichts der Tatsache, dass beide Sprachen "unterschiedlich" sind, ist es wahrscheinlich, dass C ++ - Compiler irgendwann keinen Code mehr in der C-Sprache unterstützen (da modernes C ++ bei grundlegenden Dingen wie Zeigern, dynamischem Speicherhandling usw. von der C-Mentalität abweicht).
  4. Gibt es im Moment eine Zusammenarbeit zwischen den Leuten, die die Standards von C / C ++ erstellen, um die Kompatibilität aufrechtzuerhalten?
  5. Wenn # 4 ja ist, könnte eine solche Zusammenarbeit in naher Zukunft mit dem Erscheinen des modernen c ++ enden (14.11.17)

Ich weiß, dass es bereits ähnliche Fragen gibt, aber ich bin mir sicher, dass viele Menschen diese Fragen teilen. Daher bin ich sehr daran interessiert, gute Antworten zu erhalten, insbesondere für die Punkte, die in naher Zukunft mit der C ++ - Tendenz zu tun haben.


35
Und das stimmte so lange nicht, bis das Erscheinen von C ++ x0, C ++ 11 Nein, C89 ist keine Teilmenge von C ++ 98.

35
Should I stop using the term C/C++. Ja. Dies wird nur von Personalvermittlern und der Personalabteilung verwendet. Ingenieure verwenden den Begriff Coder C++als unabhängige Sprachen. Wenn Sie einen Ingenieur finden, der den Begriff mischt, meiden Sie ihn.
Martin York

8
@LokiAstari: wirklich? Ich denke, SQLite-Entwickler sind HR, da sie keine offenen Positionen haben. Dies ist eine unglaublich restriktive Sichtweise (bitte stimmen Sie meine Antwort ab, wie es andere in Ihrer Situation getan haben).

4
@greyfade: Es ist schlimm anzunehmen, dass jeder, überall, Anspruch auf eine häufig gesehene Folge von Zeichen erheben kann. "C / C ++" ist möglicherweise der Name, der für eine bestimmte Sprache gewählt wurde. Dies bedeutet jedoch nicht, dass sich die Verwendung von "C / C ++" auf diese Sprache bezieht. Dies gilt auch dann, wenn ich diese Website kopiert und "C / C ++" durch "ersetzt habe "C ++ 1z", dass alle Diskussionen über den Entwurf des C ++ - Standards plötzlich eine falsche Terminologie verwenden würden. Einfach ausgedrückt, der String "C / C ++" hat sich nie auf die Scherzsprache "C / C ++" bezogen und wird es auch nie tun.
Ben Voigt

32
@TomDworzanski, stroustrup.com/bs_faq.html#C-is-subset "Im engeren mathematischen Sinne ist C keine Teilmenge von C ++ ... C ++ unterstützt jedoch alle von C unterstützten Programmiertechniken Es kommt selten vor, dass in wenigen Stunden zehntausende Zeilen von C in C ++ konvertiert werden können. Daher ist C ++ ebenso eine Obermenge von ANSI C wie ANSI C eine Obermenge von K & R C und ISO C ++ eine Obermenge von Eine Obermenge von C ++, wie es 1985 existierte. Gut geschriebenes C neigt auch dazu, legal zu sein. Zum Beispiel ist jedes Beispiel in Kernighan & Ritchie: "Die C-Programmiersprache (2. Ausgabe)" auch ein C ++ - Programm. "
Ben

Antworten:


183

C war nie eine Teilmenge von C ++. Das offensichtlichste Beispiel dafür ist int new;. Dies gilt seit C89 und C ++ 98, und die Sprachen sind mit dem Erscheinen neuer Standards immer weiter voneinander gewachsen.

Sollte ich aufhören, den Begriff C / C ++ zu verwenden?

Ja

Wenn die Antwort auf # 1 Ja lautet, wie würde ich ein Programm aufrufen, das eine Mischung aus C und C ++ verwendet?

Eine Quelldatei ist in der einen oder anderen Sprache geschrieben. Ein Programm kann aus Code aus mehreren Sprachen bestehen, die zusammenarbeiten, oder aus einer ausführbaren Datei, die durch Verknüpfen verschiedener kompilierter Objekte erstellt wird. Sie würden sagen, das Programm wurde in C und C ++ geschrieben, "C / C ++" ist keine Sprache.

Da es sich bei beiden um unterschiedliche Sprachen handelt, werden C ++ - Compiler wahrscheinlich irgendwann keinen Code mehr in der C-Sprache unterstützen

3) Sie haben es nie getan. char *a = malloc(10);. C und C ++ waren noch nie vollständig kompatibel, solange sie ISO-Standards hatten (ich kenne nicht alle Details zu den vorstandardisierten Tagen). Klicken Sie auf die Links oder sehen Sie unten nach, welche Datei mit C89 und höher kompatibel ist, aber unter keinem C ++ - Standard gültig ist.

4) afaik nein, die arbeitsgruppen sind sich bewusst, aber die standards treffen die entscheidungen, die für sie am besten sind.

/* A bunch of code that compiles and runs under C89 but fails under any C++ */

/* type aliases and struct names occupy separate namespaces in C, not in C++ */
struct S { int i; };
typedef int S;


struct Outer { struct Inner { int i; } in; };
/* struct Inner will be Outer::Inner in C++ due to name scope */
struct Inner inner;


/* default return type of int in C, C++ functions need explicit return types */
g() {
    return 0;
}


/* C sees this as two declarations of the same integer,
 * C++ sees it as redefinition */
int n;
int n;


/* K&R style argument type declarations */
void h(i) int i; { }


/* struct type declaration in return type */
struct S2{int a;} j(void) { struct S2 s = {1}; return s; }


/* struct type declaration in argument, stupid and useless, but valid */
/*void dumb(struct S3{int a;} s) { } */


/* enum/int assignment */
enum E{A, B};
enum E e = 1;


void k() {
    goto label; /* C allows jumping past an initialization */
    {
        int x = 0;
label:
        x = 1;
    }
}


/* () in declaration means unspecified number of arguments in C, the definition
 * can take any number of arguments,
 * but means the same as (void) in C++  (definition below main) */
void f();

int main(void) {
    f(1); /* doesn't match declaration in C++ */
    {
        /* new is a keyword in C++ */
        int new = 0;
    }

    /* no stdio.h include results in implicit definiton in C.  However,
     * as long as a matching function is found at link-time, it's fine.
     * C++ requires a declaration for all called functions */
    puts("C is not C++");
    {
        int *ip;
        void *vp = 0;
        ip = vp; /* cast required in C++, not in C */
    }
    return 0;
}

/* matches declaration in C, not in C++ */
void f(int i) { }

Ich fühle mich immer ist es erwähnenswert , dass C ist eine Teilmenge von Objective-C.


59
Objective-C wurde speziell entwickelt, um eine strikte Obermenge von C ohne widersprüchliche Syntax und mit einem vollständig orthogonalen Objektsystem zu sein. Dies ist so extrem, dass Sie den Teil "Objective" von "Objective-C" tatsächlich nehmen und in andere Sprachen integrieren können, z. B. Objective-MODULA-2. Und am bekanntesten ist Apples Objective-C ++, das zwei vollständig orthogonale, nicht interagierende, nicht integrierte Objektsysteme enthält.
Jörg W Mittag

20
@masonwheeler Wenn OP sehen möchte, wie eine tatsächliche Obermenge von C aussieht.
Xhainingx

26
"Eine Quelldatei ist in der einen oder anderen Sprache geschrieben." Sagen Sie das meinem Programm, das sowohl als Standard C99 als auch C ++ 89 sauber kompiliert. Keine der beiden Sprachen ist eine Teilmenge der anderen, aber es gibt einen Schnittpunkt ihrer beiden Mengen, auf den weitgehend abgezielt wird. Siehe Lua et al.
Munificent

28
@munificent Ich kann C ++ - Code schreiben, der auch ausgeführt werden kann javac, aber worum geht es?
Xhainingx

22
@munificent Ein Beispiel für ein Programm, das in drei Sprachen kompiliert werden kann - C, / bin / sh und f77 -, ist der Eintrag applin.c im IOCCC 1986. Nach Ihrer Definition ist das Tag C/Fortran/shjetzt sinnvoll ?! ioccc.org/years-spoiler.html#1986 .
Sjoerd

108

Es muss einen Grund geben, warum diese Begriffe so oft zusammenkommen. Während Sie Ihrem C-Lehrer nicht sagen sollten, dass seine Sprache eine Teilmenge von C ++ ist, gibt es hier einige Wahrheiten. Andere haben bereits die Sichtweise Ihres Lehrers enthüllt. Das ist sehr schön (und mit Beispielen usw. illustriert). Aber wir leben nicht in einem Elfenbeinturm oder einem Buch.

Ihr Chef könnte sich nicht weniger für die genaue Sprache interessieren, die Sie verwendeten. Wenn er sich ein wenig mit Programmieren auskennt, sagen Sie ihm einfach, dass Sie C / C ++ verwendet haben, und es klingt wie "Ich habe eine Sprache verwendet, die für den Maschinencode kompiliert werden muss, mit DLLs und all den komplizierten Dingen". Dies ist der Teil "Externe Kommunikation".

Wenn Sie eine Bibliothek erstellen, die sowohl mit C als auch mit C ++ kompatibel ist, möchten Sie sie unbedingt C / C ++ - Bibliothek nennen. Natürlich wird jemand eine Hand heben und fragen, warum Sie dies nicht eine C-Bibliothek nennen, die zufällig einen C ++ - Wrapper hat, und trotzdem kann C ++ eine Verknüpfung zu C-Bibliotheken herstellen, sodass Sie es überhaupt nicht erwähnen müssen. Beantworten Sie einfach: "Ja, Sie haben Recht, dies ist eine C / C ++ - Bibliothek". Dies ist der Teil "Interne Kommunikation".

Wenn Sie einen lexikalischen Analyzer für C ++ erstellen, werden Sie überrascht sein, wie gut er mit C funktioniert. Möglicherweise müssen Sie nicht alle Änderungen vornehmen. Dies ist die "wenn es aussieht wie eine Ente, etc." Teil.

Usw.

Die meisten C-Programme, die ich jemals gesehen habe, kompilieren (und arbeiten) ohne Änderung als C ++ - Code. Lassen Sie sich nicht von ein paar Ausnahmen oder dogmatischen (jedoch einflussreichen) Programmierern täuschen. C und C ++ sind so nah beieinander und so oft kompatibel und so oft gemischt und aufeinander abgestimmt, dass der Begriff C / C ++ verwendet wird. Es wird verwendet, weil es nützlich ist, solche Situationen zu beschreiben, in denen es nicht wirklich wichtig ist, ob Sie C oder C ++ in Betracht ziehen, sofern es sich nicht um Java oder PHP handelt . Wir wissen, dass es "falsch" ist, aber es ist uns egal, es ist nützlicher als falsch.

Es mag missbraucht werden, es mag dumm sein, aber ich bin mir nicht sicher, welchen Nutzen es haben wird, wenn Sie pedantischer als nötig sind und sich weigern, in Begriffen zu kommunizieren, die andere verstehen. Wenn Sie sich in einer bestimmten Situation unwohl fühlen, verwenden Sie einfach nicht den Oberbegriff C / C ++, sondern den für den Fall relevanten (entweder C oder C ++).

Hab keine Angst vor der Zukunft. Unsere Betriebssysteme sind in C geschrieben. Ein Großteil der aktuellen C / C ++ - Softwareproduktion findet in C ++ statt. Dieses Paar ist für eine Weile hier. Niemand hat Interesse daran, dass das eine mit dem anderen inkompatibler wird (genau umgekehrt).

Um genau zu sein über Ihre Punkte:

1) Es kommt darauf an. Ja, wenn es zu Verwirrung führen kann, wenn Sie sich unwohl fühlen oder wenn es einfach falsch oder aus dem Zusammenhang geraten ist. Nein, wenn Sie es für angemessen halten.

2) N / A

3) Ich denke nein, aber ich habe keine Kristallkugel.

4) keine Ahnung

5) Ich denke nicht, da nichts in diese Richtung drängt


7
Kommentare wurden entfernt, da sie laut wurden.
ChrisF

3
Warum hat das so viele positive Stimmen? Es ist voller Ungenauigkeiten und falscher Behauptungen!
Zaibis,

5
@Zaibis Würdest du freundlich genug sein, um zu erläutern, welche Behauptungen falsch oder ungenau sind?
Benutzernummer

3
Nach Ihrer Logik sollte C / C ++ / Objective-C / Fortran / Pascal ein gültiger Ausdruck sein, aber das klingt albern. Das Problem mit dem Begriff C / C ++ ist, dass es mehrere Dinge bedeuten kann, so dass Sie keine Garantie haben, dass die gewünschte Bedeutung erreicht wird. In meiner Praxis verstehen die Leute es normalerweise als "C ist nur eine alte primitive Version von C ++" und das ist einfach falsch.
Martinkunev

4
Über die eigentliche Gültigkeit des Begriffs hinaus C/C++ist dies nicht eindeutig und daher nicht sinnvoll. In Anlehnung an Ihre Beispiele C/C++ librarykönnte a entweder eine C-Bibliothek mit einem C ++ - Wrapper oder eine C ++ - Bibliothek mit einem C-Wrapper bedeuten. Oder es könnte bedeuten, dass die Bibliothek aus mehreren Modulen besteht, einige mit C ++ kompiliert, andere mit C. Dies ist überhaupt nicht klar. Zu sagen, dass eine Bibliothek erstellt wird, ist für mich C and C++viel klarer oder C library with compatibility with C++auch viel klarer. Und hier ist die Mehrdeutigkeit mit nur zwei Sprachen, stellen Sie sich vor, Sie verwenden diese "Kommunikationsstrategie" für mehr ...
mühsame

43

Gegen den Strom würde ich sagen, dass es vom Kontext abhängt .

Der Begriff "C / C ++" ist normalerweise nicht angemessen, wenn man so etwas wie "Dies ist ein C / C ++ - Programm" sagt, aber dies wurde in anderen Antworten eingehend untersucht.

Es kann jedoch Kontexte geben, in denen C / C ++ geeignet sein kann.

  • Es gibt verschiedene Bibliotheken, die normalerweise sowohl eine C- als auch eine C ++ - API haben. Ich denke, es ist nicht weit von der Wahrheit entfernt, wenn man so etwas eine C / C ++ - Bibliothek nennt. Wir Menschen mögen es, Informationen zu komprimieren. Wenn wir also sagen, dass "opencv eine C / C ++ - Bibliothek ist", ist dies kurz, klar und verständlich.
  • Sie können über Sprachdesign und Syntax sprechen. Aus Sicht der Sprachsyntax könnte man sagen, dass eine Sprache eine C / C ++ -ähnliche Syntax hat.
  • Sie organisieren einen Codierungswettbewerb und akzeptieren beide in C und C ++ geschriebenen Lösungen
  • Sie stellen einen neuen Programmierer ein, und die meisten Aufgaben werden entweder C oder C ++ sein, sodass der Programmierer beide Sprachen beherrschen muss. Dies ist in der Embedded-Entwicklung üblich, wo C für einige (normalerweise sehr kleine) Mikrocontroller besser geeignet ist und C ++ für andere. In diesem Fall könnten Sie sagen, Sie suchen einen C / C ++ - Programmierer.

10
Ich sehe diese Positionen gegen den allgemeinen Konsens hier auf P.SO. (wo Sie alles, was "agil / hype / wie das eine und einzigartige Richtige" aussieht, positiv bewerten und den Rest negativ bewerten müssen) sind wie gewohnt willkommen. Leute, Programmierung ist keine Religion, und diese Website ist kein heiliges Buch.

16
Der letzte Aufzählungspunkt zeigt tatsächlich ein großes Problem: Sie suchen (1) für eine Person , die knowns entweder C oder C ++, (2) einer Person , die weiß , sowohl C und C ++ oder (3) eine Person , die verwirrt ist zu hören , das ist verschiedene Sprachen. Hilf nicht, dass der dritte Pool wächst.
5gon12eder

10
Der letzte Punkt wäre besser ausgedrückt als "Programmierer mit Erfahrung in C und C ++", wenn Sie danach suchen. Eine Stellenanzeige mit dem Titel "Programmierer", in der unter den erfahrungsgemäß erforderlichen Überschriften die Bezeichnungen "C und C ++" oder "C oder C ++" nicht wesentlich von einer Stellenanzeige mit dem Titel "Programmierer" und der Bezeichnung "C / C ++" als erforderliche Qualifikation unterschieden werden, dies ist jedoch der Fall viel genauer. Die Art von Person, die Sie für einen solchen Job suchen, mag diese Genauigkeit des Ausdrucks sehr zu schätzen wissen.
ein Lebenslauf vom

10
In der geschriebenen Sprache wird das '/' normalerweise als logisch interpretiert or, nicht als logisch xor. Es ist also entweder eins oder beides. In Stellenangeboten kennen Sie entweder C oder C ++ oder beides. Ich habe das Gefühl, dass viele Leute religiös über den Begriff sind. Ein guter C-Programmierer kann C ++ problemlos lernen, unabhängig davon, wie unterschiedlich beide Sprachen sind. Ich habe mit dem Programmieren von PHP begonnen und bin dann zu Scala (zwei völlig verschiedene Sprachen) gewechselt. Warum sollte ein C-Programmierer nicht in der Lage sein, C ++ oder umgekehrt zu lernen? Der C / C ++ - Ausdruck hat einige Vorteile, wenn er im richtigen Kontext verwendet wird.
ILikeTacos

4
Sie können auch C / C ++ verwenden, um ein Programm zu beschreiben, das beim Kompilieren als C oder C ++ funktionieren soll, oder ein Programm mit separaten C- und C ++ - Komponenten.
immibis

30

Im Allgemeinen fragen die SO-Benutzer die Person, die die Frage stellt, nach einer Sprache: C oder C ++. Warum?

Es gibt viele subtile Unterschiede zwischen C und C ++. In C ++ hat eine constVariable im globalen Bereich beispielsweise eine interne Verknüpfung, sofern dies nicht deklariert externist, in C jedoch eine externe Verknüpfung, sofern dies nicht deklariert ist static. Mit "C / C ++" bestätigt das OP das Wissen, dass die Antwort auf ihre Frage sowohl in C als auch in C ++ gleich ist, wenn dies nicht unbedingt der Fall ist. Dies erschwert den potenziellen Antwortenden unnötigerweise die Arbeit.

  • Manchmal stellen wir fest, dass der Code in der einen oder anderen Sprache nicht gültig ist (implizite Konvertierungen von void*zu Zeiger auf Objekt sind beispielsweise in C ++ nicht gültig). Das ist nervig. Warum sagen Sie "C / C ++", wenn Sie einen Code haben, der in C, aber nicht in C ++ gültig ist? Wollten Sie C oder ist dies nur ein Fehler im Code, der C ++ sein soll?

  • Manchmal ist die Antwort je nach Sprache unterschiedlich (z. B. gibt es in C99 Arrays mit variabler Länge, aber nicht in C ++). Wenn wir nicht wissen, über welche Sprache Sie sprechen, müssen wir entweder raten oder eine Antwort für beide schreiben, wenn nur eine tatsächlich nützlich ist, da Sie wissen, welche Sprache Sie tatsächlich verwenden. du sagst es uns einfach nicht!

  • Manchmal ist die Antwort für beide Sprachen wirklich gleich, aber es ist schwer, sicher zu sein. Ich denke zum Beispiel, dass C und C ++ die gleichen Regeln für die Konvertierung ganzer Zahlen haben, aber um wirklich, wirklich sicher zu sein, muss ich beide Standards sorgfältig lesen. Auch hier mache ich doppelt so viel Arbeit wie nötig, wenn Sie sich wahrscheinlich nur für eine der Sprachen interessieren.

Wie auch immer, um Ihre anderen Fragen zu beantworten:

  1. Ja.

  2. Wenn Sie C- und C ++ - Code miteinander verknüpfen, können Sie beide Tags verwenden. Geben Sie jedoch an, in welcher Sprache sich die einzelnen Dateien befinden.

  3. Es gibt manchmal wichtige Änderungen, aber sie sind selten und haben in der Regel nur eine begrenzte Auswirkung (andernfalls werden sie nicht genehmigt). Zum Beispiel autoin C ++ 11.

  4. Ich glaube nicht, dass sie direkt zusammenarbeiten, aber sie achten auf Entwicklungen in der anderen Sprache und versuchen, Änderungen zu vermeiden, die die Kompatibilität erschweren würden.

Und wenn Sie wirklich beide Sprachen kennen lernen wollen, ist das in Ordnung, und das können Sie in Ihrer Frage sagen. Wenn Sie "C / C ++" sagen, bin ich mir nicht sicher, was Sie meinen, und es sieht wirklich so aus, als würden Sie eine Vermutung über die beiden Sprachen anstellen.


7
Ich weiß, dass es Leute gibt, die Code im Schnittpunkt von C und C ++ schreiben und einen C ++ - Compiler für die Typprüfung verwenden, aber einen C-Compiler für die Codegenerierung. Ich habe aber keine Ahnung, ob das überhaupt Sinn macht oder nicht. Es ist jedoch ein Thema, das alle paar Jahre in der Linux-Kernel-Mailingliste auftaucht, wenn jemand einen Patch einreicht, um das (im Unified Object-Oriented Driver Model des Linux-Kernels sehr wichtige) struct classin so etwas wie struct klassund umzubenennen dann wird er immer von Linus abgeschossen.
Jörg W Mittag

3
@ JörgWMittag: Ich habe noch nie jemanden getroffen, der "C / C ++" als Abkürzung für "die gemeinsame Teilmenge von C und C ++" verwendete und auch wusste, wovon er sprach. Personen, die absichtlich in der gemeinsamen Teilmenge arbeiten, neigen dazu, dies durch Nichtabkürzung zu verdeutlichen.
Bart van Ingen Schenau

2
Dies ist eine gute Antwort speziell auf die Verwendung von C / C ++ in Stack Exchange-Fragen und nicht allgemein.
immibis

@BartvanIngenSchenau Wie viele Mitglieder des std-Komitees haben Sie getroffen?
Neugieriger

18

Mir wurde immer gesagt, dass C eine Teilmenge von C ++ ist oder C ++ C mit Klassen ist. Und das war bis zum Erscheinen von C ++ x0, C ++ 11 (oder dem modernen C ++ 11/14/17 im Allgemeinen) ziemlich richtig.

C war noch nie eine Teilmenge von C ++. Zum Beispiel ist C89 keine Teilmenge von C ++ 98.

Einige Beispiele:

  • Das C89- Bezeichnerlistenformular für die Deklaration von Funktionsparametern wird in C ++ nicht unterstützt
  • C89 und C ++ 98 haben unterschiedliche Typen für die Zeichenkonstanten
  • C89 und C ++ 98 haben unterschiedliche Typen für Zeichenfolgenliterale
  • logische Operatoren ergeben unterschiedliche Typen in C89 und C ++ 98 ( intvs bool)
  1. Sollte ich den Begriff C / C ++ nicht mehr verwenden?

Ja.

  1. Wenn die Antwort auf # 1 Ja lautet, wie würde ich ein Programm aufrufen, das eine Mischung aus C und C ++ verwendet?

Ein Programm ist entweder C oder C ++ (wenn selbst ein sehr einfaches Programm entweder mit einem C- oder einem C ++ - Compiler kompiliert werden kann). Welchen Compiler verwenden Sie, um es zu kompilieren? Es sollte Ihre Frage beantworten. Harbison & Steele haben den Begriff Clean C geprägt , um eine gemeinsame Teilmenge von C und C ++ zu bezeichnen, aber ich denke, es war eine schlechte Idee.

BEARBEITEN : Allerdings gebe ich zu, dass Sie technisch C- und C ++ - Objektdateien in einem einzigen Programm verknüpfen können, aber es gibt viele Sprachen, die in einem einzigen Programm gemischt werden dürfen, zum Beispiel Java und C ++. Ich denke, dass die Verwendung des Begriffs C / C ++ - Programm nur zu der Verwirrung beiträgt, dass es in einer einzigen Sprache namens C / C ++ geschrieben ist.

  1. Angesichts der Tatsache, dass beide Sprachen "unterschiedlich" sind, ist es wahrscheinlich, dass C ++ - Compiler irgendwann keinen Code mehr in der C-Sprache unterstützen (da modernes C ++ bei grundlegenden Dingen wie Zeigern, dynamischem Speicherhandling usw. von der C-Mentalität abweicht).

Es gibt viele Funktionen (Beispiel: Array variabler Länge, flexibles Array-Mitglied, _Generic...) von C99 oder C11, die von keiner C ++ - Version unterstützt werden.


Zu mehrsprachigen Programmen: Ein Programm, das JNI ausgiebig verwendet, kann als C / Java-Programm bezeichnet werden. Die Tatsache, dass zwei Sprachen zusammen verwendet werden, bedeutet nicht, dass sie zusammen kompiliert werden.
immibis

1
stroustrup.com/bs_faq.html#C-is-subset "Im engeren mathematischen Sinne ist C keine Teilmenge von C ++ ... C ++ unterstützt jedoch alle von C unterstützten Programmiertechniken ... Dies ist nicht ungewöhnlich C ++ kann in wenigen Stunden zehntausende Zeilen von C in C-style C ++ konvertieren. Somit ist C ++ ebenso eine Obermenge von ANSI C wie ANSI C eine Obermenge von K & R C und ISO C ++ eine Obermenge von C ++ wie es 1985 existierte . Gut geschriebenes C neigt auch dazu, legal zu sein. Zum Beispiel ist jedes Beispiel in Kernighan & Ritchie: "Die C-Programmiersprache (2. Ausgabe)" auch ein C ++ - Programm. "
Ben

@Ben das erste Programm (Hallo Welt) in "The C Programming Language (2nd Edition)" lässt den Rückgabetyp von main weg, der in C ++ ungültig ist.
ouah

1
@ouah, es sieht so aus, als hätte Professor Stroustrup damals einen verpasst :-) Beachten Sie, dass dies auch in C11 nicht erlaubt ist :-) Ich bin mir ziemlich sicher, dass dies in früheren Versionen von C ++ erlaubt war.
Ben

4
@ouah, das ist nicht die erste Version von C ++. Das Buch stammt aus dem Jahr 1988 und zu diesem Zeitpunkt war keine Sprache ein ISO-Standard. Die aktuelle Version von C ++ war damals Bjarne Stroustrups 1985 erschienenes Buch.
Ben

17

Einige Programme sind in einer Mischung aus C und C ++ geschrieben

Dies ist nur eine Tatsache des Lebens. Sie können Objektdateien aus C und C ++ kompilieren und miteinander verknüpfen. Das Ergebnis kann durchaus als "C / C ++ - Programm" bezeichnet werden.

Aber das ist nur das Programm als Ganzes. Was ist mit den einzelnen Zusammenstellungseinheiten?

Es gibt eine Teilmenge von C, die auch eine Teilmenge von C ++ ist

Ein in dieser Untermenge geschriebenes Programm (oder eine Kompilierungseinheit) kompiliert und verhält sich unter konformen C- und C ++ - Compilern gleich. Ein solches Programm oder eine solche Datei kann zu Recht "ein C / C ++ - Programm" oder "eine C / C ++ - Datei" genannt werden.

Ein Teilprogramm wie eine Header-Datei kann auch in C- und C ++ - Programmen verwendet werden. Solche Header-Dateien können zu Recht als C / C ++ - Header bezeichnet werden.

Zitat von Professor Bjarne Stroustrup:

Ist C eine Teilmenge von C ++?

Im engeren mathematischen Sinne ist C keine Teilmenge von C ++. Es gibt Programme, die gültiges C, aber kein gültiges C ++ sind, und sogar einige Möglichkeiten, Code zu schreiben, der in C und C ++ eine andere Bedeutung hat. C ++ unterstützt jedoch alle von C unterstützten Programmiertechniken. Jedes C-Programm kann in C ++ im Wesentlichen auf die gleiche Weise mit derselben Laufzeit- und Speichereffizienz geschrieben werden. Es ist nicht ungewöhnlich, in wenigen Stunden zehntausende Zeilen von ANSI C in C ++ zu konvertieren. Somit ist C ++ ebenso eine Obermenge von ANSI C wie ANSI C eine Obermenge von K & R C und ISO C ++ eine Obermenge von C ++, wie sie 1985 existierte.

Gut geschriebenes C ist in der Regel auch legal in C ++. Zum Beispiel ist jedes Beispiel in Kernighan & Ritchie: "The C Programming Language (2nd Edition)" auch ein C ++ - Programm.

Also ja, es gibt so etwas wie C / C ++. Es ist alles, was sowohl gültiges C als auch gültiges C ++ ist.

Der C-Pre-Prozessor ist Teil der C-Sprache. Der C ++ - Vorprozessor ist Teil der C ++ - Sprache

Sie können eine Kompilierungseinheit schreiben, die unter C oder C ++ kompiliert wird und unterschiedlich ist . Beispielsweise können grundlegende Funktionen in C kompiliert werden, bei der Kompilierung in C ++ wird jedoch eine C ++ - Bibliothek verwendet.

Wenn das Programm im Wesentlichen dasselbe ist, aber über zusätzliche Funktionen verfügt, ist es nicht gerade falsch zu sagen, dass es dasselbe Programm ist. Es ist das gleiche, aber auch anders.

Die meisten C-Programmierer können zumindest ein bisschen C ++ und umgekehrt

Es ist nicht unvernünftig, eine solche Person als C / C ++ - Programmierer zu bezeichnen. Ja, sie sind wahrscheinlich auf eine Sprache spezialisiert, aber gibt es jemanden, der ein kompetenter C- oder C ++ - Programmierer ist, der buchstäblich keine der anderen Sprachen beherrscht? In gewisser Weise sind sie nicht alle C / C ++ - Programmierer?

Es ist nichts Falsches daran, "C / C ++" zu sagen. Was zählt, wird verstanden

Die englische Sprache ist kein Werkzeug, um Syllogismen auszudrücken . Sie können Englisch für Logik verwenden, aber nur gerade und mit großem Aufwand.

Dies liegt daran, dass Wörter von Natur aus keine exakten Bedeutungen haben, sondern eine vage Wolke von Bezeichnungen und Konnotationen. Was zählt, ist, wenn die Leute verstehen, was Sie sagen.


5
@ BЈовић Sie sind sich nicht einig über die Akzeptanz eines kleinen Teils der Terminologie, sodass Sie zu dem Schluss kommen, dass sie den Unterschied nicht verstehen und inkompetent sind. Das ist ziemlich unvernünftig zu sagen.
Ben

4
@ el.pescado Ja. Sie werden feststellen, dass die Leute tatsächlich auf PHP / JavaScript verweisen. Warum nicht? Der Punkt ist zu verstehen, nicht mit Worten zu spielen.
Ben

10
@ BЈовић Du machst keinen Sinn. Sie sind nicht "ganz anders". C ++ ist eine viel größere Sprache als C, enthält jedoch fast das gesamte C. Es gibt Inkompatibilitäten, die verhindern, dass C ++ eine richtige Obermenge ist, aber sie sind klein, wie zusätzliche reservierte Wörter, ein paar weitere Casts werden notwendig, aber das ist so ziemlich alles. Es ist fast eine richtige Obermenge, nur nicht ganz.
Ben

7
@ BЈовић Vielleicht hast du nicht verstanden, was ich geschrieben habe. Warum schauen Sie nicht hier nach, wie es in jedem Fall möglich ist, ein C-Programm so anzupassen, dass es auch als C ++ übersetzt wird. david.tribble.com/text/cdiffs.htm#C99-vs-CPP9
Ben

7
@ BЈовић Wenn Sie in Bezug auf die Terminologie pedantisch sind, sollten Sie sich bewusst sein, dass C nicht " funktional ", sondern " prozedural " ist - ein Unterschied, den Sie möglicherweise verstehen möchten, bevor Sie anderen Inkompetenzvorwürfe vorwerfen.
RM

15
  1. Sollte ich den Begriff C / C ++ nicht mehr verwenden?

Absolut. Es ist nicht klar, was dieses Konstrukt ausdrücken soll, es sei denn, es besteht möglicherweise Verwirrung darüber, was C und C ++ im Namen der Person sind, die den Begriff verwendet.

Da diese Verwirrung eine so häufige Ursache für Frustration ist, sind viele Menschen ziemlich emotional geworden, und das Erscheinen dieses Begriffs allein ist Grund genug für sie, Ihren Beitrag negativ zu bewerten. Das mag albern erscheinen, aber es scheint das zu sein, was wir haben.

Ich empfehle, anstatt von „C / C ++“ zu sprechen, einen Begriff zu verwenden, der deutlich macht, was Sie meinen.

  • Wenn Sie über etwas in C sprechen , die nicht auch wahr sein könnten oder für C ++, sagt einfach C .

    Beispiel: Wie soll die mainFunktion in C deklariert werden?

    Auf den ersten Blick scheint die Antwort für C ++ dieselbe zu sein: int main()oder int main(int, char**). Im weiteren Verlauf der Diskussion kann es jedoch relevant sein, darauf hinzuweisen, dass die Funktion in C ++ im globalen Bereich deklariert werden muss, was in C keinen Sinn ergibt, da sie keine namespaces enthält. Andererseits erlaubt C das mainrekursive Aufrufen, während C ++ dies nicht tut. In C ++ gibt es einen impliziten return 0;Fehler, mainaber in C ist die returnAnweisung für jeden Pfad erforderlich. Die Liste geht weiter und es macht die Diskussion viel einfacher, wenn Sie vorher klarstellen, welche Sprache diskutiert werden soll.

  • Wenn Sie über etwas in C ++ sprechen, das möglicherweise auch für C zutrifft oder nicht, sagen Sie einfach C ++ .

    Beispiel: Wird ein malloc()ed-Array von ints in C ++ anfänglich nur aus Nullen bestehen?

    Die kurze Antwort für C ist zufällig dieselbe: nein. Aber im weiteren Verlauf der Antwort könnte es sich lohnen, darauf hinzuweisen, dass in C calloceine gute Alternative wäre, während in C ++ die Verwendung von a std::vector<int>möglicherweise die bessere Wahl gewesen wäre.

  • Wenn Sie auf eine Ähnlichkeit zwischen C und C ++ hinweisen möchten, sagen Sie C und C ++ .

    Beispiel: In C und C ++ ist die sizeofan- intImplementierung definiert und kann zwischen Compilern und Architekturen variieren.

    An dieser Stelle möchten wir darauf hinweisen, dass sich C und C ++ gleich verhalten. Wir sprechen explizit über beide Sprachen.

Ich empfehle Ihnen sogar, noch genauer zu sein und nicht nur über "C" oder "C ++" zu sprechen, sondern auch über die genaue Version. Beide Sprachen entwickeln sich und eine stumpfe Aussage wie

C ++ unterstützt /* … */und // …kommentiert, während C nur den /* … */Stil unterstützt .

ist weder richtig noch falsch.

  1. Wenn die Antwort auf # 1 Ja lautet, wie würde ich ein Programm aufrufen, das eine Mischung aus C und C ++ verwendet?

Da sich die Sprachen überschneiden, enthält jedes C-Programm Teile , die wie C ++ aussehen könnten und umgekehrt. Dennoch werden sich die Autoren wahrscheinlich darauf geeinigt haben, entweder einen C- oder einen C ++ - Compiler zu verwenden. Sagen Sie also "das Programm ist in C geschrieben ", wenn es mit einem C-Compiler kompiliert wurde, und "das Programm ist in C ++ geschrieben ", wenn sie einen C ++ - Compiler verwenden, auch wenn sie möglicherweise die Verwendung moderner C ++ - Funktionen verweigern. Einige Leute bezeichnen solchen C ++ - Code als C ++ im C-Stil . Das Fehlen von Überladung, Ausnahmen, Polymorphismus, Vorlagen und I / O-Streams ist ein gemeinsames Merkmal eines solchen Codes.

Wenn stattdessen einige Dateien in C geschrieben und mit einem C-Compiler kompiliert werden und einige andere Dateien in C ++ geschrieben und mit einem C ++ - Compiler kompiliert werden und dann die Objektdateien miteinander verknüpft werden, würde ich sagen, dass „das Programm in a geschrieben ist Mischung aus C und C ++ “, wie Sie es bereits getan haben.

Wenn die Autoren jedoch große Sorgfalt darauf verwendet haben, jede einzelne Datei so zu schreiben, dass sie mit einem C- oder C ++ - Compiler kompiliert werden kann und das resultierende Programm dasselbe tut, könnte man sagen, dass „das Programm wird in einer gemeinsamen Teilmenge von C und C ++ geschrieben.

Letzteres ist häufig bei Header-Dateien der Fall, die von C- und C ++ - Code gemeinsam genutzt werden sollen. Das Schreiben eines solchen Codes ist übrigens nicht einfach. Wenn Sie weiter betonen wollen , dass nur solche Konstrukte wurden verwendet , die gültig sind in C und C ++ und werden häufig von verschiedenen Compiler - Herstellern unterstützt, der Begriff eine tragbare gemeinsame Teilmenge von C und C ++ verwendet wird , kann dies zu betonen.

  1. Angesichts der Tatsache, dass es sich bei beiden Sprachen um „unterschiedliche“ Sprachen handelt, werden C ++ - Compiler wahrscheinlich irgendwann keinen Code mehr in der C-Sprache unterstützen (da modernes C ++ bei grundlegenden Dingen wie Zeigern, dynamischem Speicherhandling usw. von der C-Mentalität abweicht).

Ich bin nicht sicher, ob ich diese Frage verstehe. Da C und C ++ sind verschiedene Sprachen, können Sie nicht ein Compiler für einen von ihnen erwarten , dass ein Programm übernimmt für die andere geschrieben. Compiler sind jedoch häufig modular aufgebaut. Wenn ein Compiler über ein C ++ - Front-End verfügt , stehen die Chancen gut, dass er auch über ein C-Front-End verfügt. (Sie würden dann über eine Befehlszeilenoption oder ein ähnliches Mittel auswählen, welche von ihnen Sie möchten.) Solange beide Sprachen weit verbreitet sind, ist es sehr unwahrscheinlich, dass sich dies ändern wird. Ihr Standpunkt zu "modernem C ++" ist meiner Meinung nach im Wesentlichen eine Frage guter Codierungsstandards und der Standardbibliothek. Aus Sicht des Compilers ist die Entwicklung beider Sprachen eher konvergierend als divergierend.

  1. Gibt es derzeit eine Zusammenarbeit zwischen den Leuten, die die Standards von C / C ++ festlegen, um die Kompatibilität zu gewährleisten?

Ja. Das in C ++ 11 und C11 eingeführte Speichermodell und die atomare Operationsbibliothek sind ein gutes Beispiel. Es scheint, dass die Designer beider Sprachen erkennen, dass Kompatibilität wichtig ist, und daran arbeiten, sie zu verbessern. Persönlich würde ich mir wünschen, dass die Zusammenarbeit intensiver und die beiden ISO-Arbeitsgruppen vielleicht sogar zusammenarbeiten, aber meine Wünsche sind nicht wichtig.

Bjarne Stroustrup spricht über die Unterschiede und Gemeinsamkeiten zwischen den verschiedenen Versionen von C und C ++ in § 44.3 der 4. Ausgabe der Programmiersprache C ++ , die ironischerweise den Titel „C / C ++ - Kompatibilität“ trägt. Die Verwendung des Begriffs könnte in diesem Fall tatsächlich angemessen sein, da klar ist, was gemeint ist.

  1. Wenn # 4 ja ist, könnte eine solche Zusammenarbeit in naher Zukunft mit dem Erscheinen des modernen C ++ enden (14.11.17)

Wie oben erläutert, ist dies in C ++ 11 geschehen und es wird erwartet / gehofft / benötigt, dass es erneut passiert.


Wie kann es weder richtig noch falsch sein?
JDługosz

4
Es hat keinen genau definierten Wahrheitswert, wie dies bei der Aussage der Fall ist, dass „grüne Dinge teuer sind“. Für eine bestimmte Kombination von Versionen von C und C ++ ist es wahr, für andere ist es falsch.
5gon12eder

5

C / C ++ ist die Schnittstelle zwischen C und C ++.

int new;ist nicht C / C ++ und ist es auch nicht vector<int> foo;.

In ähnlicher Weise ist C89 / C99 der Schnittpunkt dieser beiden Sprachen, in denen weder eine enum bool { false, true };noch for(int i = 0;;)eine zulässig ist.

Und C ++ 11 / C ++ 14 usw.

Es ist möglich, Code zu schreiben, der unter C ++ 11 und C ++ 14 kompiliert (und korrekt ausgeführt wird), obwohl das Kompilieren unter einem Code nicht impliziert, dass er unter dem anderen kompiliert wird. Tatsächlich machen das viele Leute.

Und viele Leute schreiben Code, der in C und C ++ funktioniert.

Je größer die Überlappung ist, desto sinnvoller ist es. Ich erwarte keine Fragen zu C / C ++ / Java-Code.


Obwohl es "sinnvoll" ist, über eine gemeinsame Teilmenge dieser Sprachen zu sprechen, werden viele Fragen in dieser Teilmenge keine Antworten enthalten, z. B. Was soll main () in C und C ++ zurückgeben?

Sie können jedoch über Code sprechen, der für mehrere Sprachspezifikationen geeignet ist, unabhängig davon, ob diese nach "Version" oder "Sprachenname" oder auf andere Weise unterschieden werden.


3

Dies ist eine Art Antwort auf die Position, dass "dies ein Code für Programmierer ist, die in der Nähe des Metalls arbeiten und in einem Managementkontext in Ordnung sind", wie in einigen anderen Antworten und Kommentaren zu sehen ist.


Ich würde argumentieren, dass auch diese Interpretation mit Sorgfalt behandelt werden sollte.

Ab Mitte der 90er Jahre, wenn Sie einen C ++ - Programmierer und jemanden haben wollten, der sich selbst als C-Programmierer bezeichnet, mussten Sie sich fragen, wie viel Sie über objektorientiertes Design wissen und wie viel Erfahrung Sie mit dem Debuggen in einem Objekt haben orientierten Kontext und über ihre Fähigkeit, Vorlagenbibliotheken zu verwenden. Sie möchten genau diese Probleme während des Interview- und Einstellungsprozesses untersuchen.

Auf der anderen Seite ist es nun mehr als ein Jahrzehnt her, dass C ++ - Gurus angefangen haben, "modernes C ++" voranzutreiben, was bedeutet, dass der Schwerpunkt nicht mehr auf nackten Zeigern, sondern auf sichereren Zeigerobjekten und iteratorbasierten Idiomen liegt. Mit dem Erscheinen von C ++ 11 gibt es jetzt eine explizite Unterstützung für die Multi-Paradigma-Programmierung, und der Trend zu Code, der keine nackten Zeiger aufweist, ist sehr stark. Wenn ich heute einen C ++ - Programmierer für eine C-Position interviewen würde, wäre ich sehr besorgt darüber, ob diese Person mit tatsächlichen Zeigern vertraut ist, die das Fußschießen ermöglichen.

Ich bin heutzutage nicht im Geschäft (auch nicht in dem Maße, wie ich es war, als Stack Overflow noch in den Kinderschuhen steckte), daher wage ich keine Vermutung, wie oft ein imaginärer Befragter nicht über die Cross-Over-Fähigkeiten verfügen würde, aber Ich denke, wie am häufigsten angewendet, sind die Sprachen jetzt in der Tat sehr unterschiedlich.

Kurz gesagt, "C / C ++" sollte nicht nur in technischen Kontexten, sondern auch in den meisten geschäftlichen Kontexten fallengelassen werden.


Ein guter Weg, um darauf hinzuweisen, dass die Mehrdeutigkeit, ob es sich um "entweder C oder C ++, wer weiß", "C und C ++, miteinander verknüpft", "C und C ++, die Schnittmenge" oder "C oder C ++, wen interessiert" handelt ist zunehmend weniger vertretbar, auch wenn man damit irgendwie durchkommen könnte.
Deduplicator

2

Die einfachste Antwort auf diese Frage ist, dass Sie diesen Begriff niemals hätten verwenden dürfen. Es ist ein Begriff, der nicht existieren sollte. Es hat keine Bedeutung. Jedes Programm ist entweder C oder C ++.

Und das war bis zum Erscheinen von C ++ x0, C ++ 11 (oder dem modernen C ++ 11/14/17 im Allgemeinen) ziemlich richtig.

C ++ 98 und 03 sind mit Classes auch nicht remote C. Wer dir das beigebracht hat, weiß nichts und du kannst sie vergessen. Das war nie richtig.


Dies ist nicht ganz richtig. Es gab einmal eine Seite, die eine vorgeschlagene Sprachspezifikation für eine Sprache namens "C / C ++" beschrieb, die unter anderem das (fast) Fehlen eines Typsystems spezifizierte. Leider wurde die Seite inzwischen entfernt, und die Website, auf der sie gehostet wurde, hat seitdem eine robots.txt-Datei erstellt, mit der die archivierte Kopie von archive.org gelöscht wurde.
greyfade

1
Aha, ich habe eine Kopie auf archive.is gefunden: Rationale , Syntax und Semantik .
greyfade

5
"Jedes Programm ist entweder C oder C ++." Ich stimme dir nicht zu. Es ist durchaus üblich, ein C-Programm zu nehmen und es Datei für Datei nach C ++ zu portieren (indem eine Compiler-Option für diese eine Datei geändert wird). Einige Dateien werden möglicherweise nie portiert und bleiben für immer in C. Ein solches Programm ist sowohl in C als auch in C ++ geschrieben
Nikie

Nicht wirklich. Dieses Programm besteht aus Unterprogrammen, von denen jedes entweder C oder C ++ ist. Jede TU, die für den Compiler das gesamte Programm darstellt, wird entweder als C oder C ++ kompiliert.
DeadMG

3
Es ist nicht der Fall, dass "jedes Programm entweder C oder C ++ ist". Prof. Bjarne Stroustrup sagt: 'Gut geschriebenes C ist in der Regel auch legal in C ++. Zum Beispiel ist jedes Beispiel in Kernighan & Ritchie: "The C Programming Language (2nd Edition)" auch ein C ++ - Programm. ' stroustrup.com/bs_faq.html#C-is-subset
Ben

1

Konzeptionell sollte es keine besonderen Schwierigkeiten geben, C-Quelldateien zu entwerfen, damit sie auch so kompiliert werden können, wie sie mit C ++ vorliegen. Dies kann in der Tat einige bedeutende Vorteile haben. Wenn Sie beispielsweise Code für ein eingebettetes System schreiben, ist es manchmal hilfreich, den Code auf einer Host-PC-Umgebung testen zu können. Wenn der Code sauber als C ++ kompiliert wird, kann eine Anweisung wie "MOTOR_ENABLE = 1;" Schreiben in ein flüchtiges E / A-Bit auf dem eingebetteten System (kompiliert als C), aber Auslösen der Emulationslogik auf dem PC (kompiliert als C ++). Es wäre wahrscheinlich auch möglich, einen C ++ - Typ auf dem PC zu entwerfen, der sich so verhält, wie sich ein uint16_t auf kleineren eingebetteten Systemen verhält (so dass u16 x=65533;ein Compiler beispielsweise den Wert von berücksichtigen müsstex*xObwohl noch keiner meiner Emulatoren dies beinhaltet (zum Teil, weil die C ++ - Compiler, die ich verwendet habe, in solchen Fällen nichts Verrücktes getan haben).

Leider haben C-Programmierer und C ++ - Programmierer eine ausreichende Antipathie zueinander, so dass sich die Sprachen im Laufe der Jahre auf kompatible Weise entwickelt haben. Während C89 versucht hat, einige der nützlicheren Funktionen von C ++ (wie Funktionsprototypen) anzupassen, scheint sich eine Einstellung herausgestellt zu haben, dass Programmierer, die eine der Funktionen von C ++ wünschen, C ++ verwenden sollten, wobei die Tatsache ignoriert wird, dass es viele Situationen gibt, in denen dies der Fall ist Es ist hilfreich, einige der Funktionen von C ++ nutzen zu können (z. B. die Möglichkeit, Funktionen mit statischen oder statischen Inline-Verknüpfungen zu überladen, ohne die Kosten für andere Funktionen in Kauf nehmen zu müssen, die nicht benötigt werden (z. B. die mit dem Exportieren verbundene Namensänderung) überladene Funktionen).

Während die Schnittstelle zwischen C89 und C ++ 98 eine funktionsfähige Sprache ist, ist die verwendbare Obermenge späterer Versionen von C mit späteren Versionen von C ++ wahrscheinlich eher geschrumpft als gewachsen (dank der strengen Aliasing-Regel), und Trends sprechen für eine allgegenwärtige zunehmende Fissur.


1
Was ist "C ++ 95"? Ein technischer Bericht?
Ben Voigt

1
Wenn Sie für Ihre internen Funktionen eine Überladung wünschen, für Ihre externen Funktionen jedoch keine Namensänderung, können Sie die ersteren anonymisieren namespaceund die letzteren als deklarieren extern "C"und dann einen C ++ - Compiler verwenden.
5gon12eder

@ BenVoigt: Mea culpa. Ich hätte es nachschlagen sollen. Die C ++ Version vor C99. Als C89 herauskam, versuchte es, C mehr wie C ++ zu machen, aber C99 fügte eine ganze Reihe von Funktionen hinzu, an denen C ++ definitiv nicht interessiert war (z. B. Arrays mit variabler Länge). Ich programmiere nicht viel in C ++, aber ich denke, ein paar C ++ - Funktionen würden C mehr helfen, als die unterschiedlichen Funktionen es geholfen haben.
Supercat

@ 5gon12eder: Ich habe noch nie versucht, C ++ - Code in ein C-Projekt zu verlinken. Ist es wirklich so einfach, dass alles entweder statisch / inline ist oder extern "C"gibt es auch andere Komplikationen (z. B. Initialisierung statischer Objekte usw.)? Gibt es in C ++ eine Möglichkeit, dies so zu gestalten, dass foo(1234)ein foo_const(1234)Makro aufgerufen wird, während foo(x)[wo xkeine Konstante ist] eine foo_var(x)Funktion aufruft ? Es gibt viele Situationen im eingebetteten Code, in denen es für eine "Funktion" sinnvoll sein kann, SET_PORT(port, state)drei Formen zu haben, je nachdem, ob Port und Status beide sind ...
supercat

... Konstanten zur Kompilierungszeit, port ist konstant, state jedoch nicht, oder wo weder port noch state Konstanten sind. Gibt es eine Möglichkeit, dies mithilfe von Vorlagen oder einem anderen Standard-C ++ - Mechanismus sauber zu bewerkstelligen, oder ist dies nur auf Compilern mit gcc-Erweiterungen möglich?
Supercat
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.