Operatorüberladung in C

Lesezeit: 7 Minuten

Ich versuche, einige Operatoren zu überladen:

/* Typedef is required for operators */
typedef int Colour;

/* Operators */
Colour operator+(Colour colour1, Colour colour2);
Colour operator-(Colour colour1, Colour colour2);
Colour operator*(Colour colour1, Colour colour2);
Colour operator/(Colour colour1, Colour colour2);

Ich erhalte diesen Fehler für jede versuchte Überladung:

expected '=', ',', ';', 'asm' or '__attribute__' before '+' token

Ich kann keine gute Dokumentation zum Überladen von Operatoren finden. Googeln führt zu C++-Tutorials, die Klassen verwenden. In C gibt es keine Klassen. Kann mir jemand helfen? Vielen Dank.

  • Nur nicht :). Was ist falsch mit struct RGB {int8_t red, green, blue;};. Brauchst du wirklich all das Meta, die ganze verdammte Zeit?

    – Matt Tischler

    5. August 2010 um 17:31 Uhr

  • Auch wenn C das Überladen von Operatoren unterstützen würde: Sind Operator* und Operator/ bei Farben sinnvoll?

    – Doc Braun

    5. August 2010 um 17:35 Uhr

  • @Doc Brown- Warum würde es keinen Sinn machen? Sobald die Operatoren überladen sind, können sie alles bedeuten, nicht nur „multiplizieren“ und „dividieren“.

    – bta

    5. August 2010 um 19:44 Uhr

  • @bta: einverstanden, aber wenn sie nicht multiplizieren und dividieren meinen, warum sich überhaupt mit Überladung beschäftigen? Selbst in C++ ist es sehr schlechter Stil, das Überladen von Operatoren zu verwenden, wenn die Operatoren nicht mit ihrer ursprünglichen Bedeutung übereinstimmen.

    – Doc Braun

    5. August 2010 um 19:59 Uhr


  • “Macht Operator* und Operator/ bei Farben Sinn?” Alpha (Vor)Multiplikation vielleicht?

    – Brian S

    5. August 2010 um 20:15 Uhr

C unterstützt das Überladen von Operatoren nicht (über das hinaus, was es in die Sprache eingebaut hat).

  • Weil Sie keine Referenzen in C haben!

    – Ali

    26. Mai 2015 um 3:21 Uhr

  • @Ali-Referenzen sind einfach syntaktischer Zucker. Das Gleiche gilt für andere C++-Features wie const, Overloading, Namespaces und Klassen. Sie fügen keine Funktionalität hinzu, sie fügen einfach andere Möglichkeiten hinzu, dasselbe zu tun. Das bedeutet nicht, dass sie redundant sind, aber es bedeutet auch definitiv nicht, dass C++-Funktionen nicht in C implementiert werden können. Alles, was C++ kann, kann C auch, nur mit einer anderen Syntax (sie nennen es aus einem bestimmten Grund “syntaktischer Zucker”) ). In diesem speziellen Fall würde das Ersetzen von Referenzen durch Zeiger einwandfrei funktionieren.

    – yyny

    15. Mai 2016 um 0:04 Uhr


  • @YoYoYonnY: Nach dieser Logik ist die gesamte C-Sprache und die gesamte C++-Sprache sind nur “syntaktischer Zucker” für die Möglichkeiten, die der Befehlssatz Ihres Computers bietet.

    – Leichtigkeitsrennen im Orbit

    14. Februar 2018 um 16:44 Uhr

  • @LightnessRacesinOrbit Nein, denn “syntaktischer Zucker” ist “ein Sprachkonstrukt, das entwickelt wurde, um das Lesen oder Ausdrücken von Code zu erleichtern, ohne die Funktionalität oder Ausdruckskraft zu beeinträchtigen”. Sie können keine Strukturen, Arrays oder Referenzen in Assembly ausdrücken (einige Assembler haben Erweiterungen). Du kann Verweise in C ausdrücken, müssen Sie nur die Referenz- und Dereferenzierungssyntax verwenden.

    – yyny

    14. Februar 2018 um 22:11 Uhr

  • @YoYoYonnY: Ich denke, ich bestreite Ihre Interpretation der Definition für syntaktischen Zucker, die mehr oder weniger die gesamte C++-Sprache zu umfassen scheint. Ich stütze das auf das vermeintliche transitive Ergebnis einer solchen Interpretation (das ganze Universum ist syntaktischer Zucker). Anrufen würde ich auf keinen Fall const “syntethischer Zucker”. Aber ich gestehe, ich habe die strenge Definition eine Weile nicht gelesen.

    – Leichtigkeitsrennen im Orbit

    15. Februar 2018 um 1:27 Uhr


In C gibt es keine Operatorüberladung.

  • Natürlich gibt es – nur zum Beispiel, -, +, /, *gelten alle gleich gut für int oder double. Was es nicht unterstützt, ist das Hinzufügen von Überladungen über das hinaus, was integriert ist.

    – Jerry Sarg

    5. August 2010 um 18:17 Uhr


Benutzeravatar von artless noise
kunstloser Lärm

Du brauchst ein Zeitmaschine um Sie ins Jahr 1985 zurückzuversetzen, damit Sie das Programm nutzen können CVorne. Es scheint, dass ‘C’ verwendet wird, um das Überladen von Operatoren zu unterstützen; so raffiniert genug, dass es immer noch möglich ist. Sehen Innerhalb des C++-Objektmodells durch Stanley B. Lippmann. OMG, C++ war C! Eine solche ein Ding gibt es noch.

Diese Antwort bestätigt die anderen. ‘C’ allein unterstützt das Überladen nicht direkt. Der wichtige Punkt ist jedoch, dass ein Programmierer Code schreiben kann, der Code versteht. Sie benötigen ein Tool, das die Quelle umwandelt, um dies zu implementieren. In diesem Fall gibt es solche Tools bereits.

Ein Papier, Meta-Kompilierung für C++, 2001 von Edward D. Willink hat interessante Beispiele für Design-Funktionalität, wo die Erweiterung einer Sprache sinnvoll ist. Die Kombination aus *nix Shellscript und make Regeln erlauben oft eine solche Transformation. Andere Beispiele sind Qt MOC, die Tools Lex und Yacc, Halogenid usw. Während ‘C’ selbst dies nicht direkt aufnimmt, tut es dies, wenn Sie bauen Gastgeber Werkzeug.

In diesem speziellen Beispiel ist das Überladen möglicherweise nicht sinnvoll. Es könnte jedoch für ein Programm, das benötigt wird, sehr sinnvoll sein beliebige Genauigkeit.

  • Vielleicht wichtig ist, dass das Überladen von Operatoren unterstützt werden kann, indem die C++-Syntax in ein „C“-Äquivalent übersetzt wird, das auf einfache Weise kompiliert werden kann. Nicht alle C++-Sprachfeatures sind einfach zu übersetzen und erfordern Linker- und andere Runtime-Compiler-Unterstützung. Beispielsweise Vorlagen und Features, die neu in C++11 und höher sind.

    – ungekünstelter Lärm

    19. August 2021 um 17:39 Uhr

  • red/black != blue*pink… nicht wirklich sicher über die Anwendungsfälle des ursprünglichen Beitrags. Außerdem haben Sie verschiedene Arten von ‘Farbaddition’. Pigmente, Farbstoffe, sind anders als Lichtquellen (wahrscheinlich das OPs-Konzept), da es sich auf die aktuelle Computeranzeigetechnologie bezieht.

    – ungekünstelter Lärm

    15. November 2021 um 15:00 Uhr

  • Ein weiterer moderner Taktik ist die Verwendung eines Compiler-Plug-Ins, das gcc um 2011 ernsthaft zu unterstützen begann, und zu diesem Zeitpunkt sind sie ein sehr guter technischer Weg, um eine Sprache zu erweitern (wie es Halide im Vergleich zu den anderen Beispielen getan hat). für domänenspezifische strukturelle Lösungen, um die Komplexität zu bewältigen und die Korrektheit sicherzustellen. Dies vermeidet das Parsing-Problem, das in der FOG-Thesenarbeit untersucht wurde (die meiner Meinung nach auch heute noch eine gute Lektüre ist). Clang unterstützt Plugins für einen längeren Zeitraum, verfügt aber erst seit kurzem über Codegenerierungsfunktionen, die gcc ebenbürtig sind.

    – ungekünstelter Lärm

    27. Mai um 13:28 Uhr


Sie können diese Operatoren in C nicht überladen.

Benutzeravatar von Roberto Bonvallet
Robert Bonvallet

C unterstützt das Überladen von Operatoren überhaupt nicht.

Sie können Operationen nur als Funktionen implementieren:

Colour colour_add(Colour c1, Colour c2);
Colour colour_substract(Colour c1, Colour c2);
...

Sie könnten auch zu C++ wechseln, aber es könnte übertrieben sein, dies nur für das Überladen zu tun.

  • Das Schreiben einer C-Bibliothek in C++ wäre ziemlich lustig. Das Einschließen der Header-Datei führt zu sofortigen Fehlern 🙂

    Benutzer142019

    7. August 2010 um 14:43 Uhr

  • Eigentlich ist das eine ziemlich einfache Aufgabe – Sie müssen es nur richtig machen (dieses ganze #ifdef __cplusplus \ extern “C” { \ #endif Zeug…). Innerhalb des externen “C”-Blocks können Sie natürlich nur das bereitstellen, was C zulässt, was bedeutet, dass ua keine Operatorüberladung mehr erforderlich ist …

    – Aconcagua

    5. Februar 2016 um 10:22 Uhr


Benutzeravatar von bta
bta

Das Überladen von Operatoren ist in C nicht verfügbar. Stattdessen müssen Sie eine Funktion zum “Pseudo-Überladen” der Operatoren verwenden:

Colour add_colours(Colour c1, Colour c2) {
    return c1 + c2; // or whatever you need to do
}

  • Das Schreiben einer C-Bibliothek in C++ wäre ziemlich lustig. Das Einschließen der Header-Datei führt zu sofortigen Fehlern 🙂

    Benutzer142019

    7. August 2010 um 14:43 Uhr

  • Eigentlich ist das eine ziemlich einfache Aufgabe – Sie müssen es nur richtig machen (dieses ganze #ifdef __cplusplus \ extern “C” { \ #endif Zeug…). Innerhalb des externen “C”-Blocks können Sie natürlich nur das bereitstellen, was C zulässt, was bedeutet, dass ua keine Operatorüberladung mehr erforderlich ist …

    – Aconcagua

    5. Februar 2016 um 10:22 Uhr


Benutzeravatar des Engineers
Techniker

Wenn Sie eine vergleichbare Kürze wünschen, ist die Verwendung von Makros die beste verfügbare Alternative:

void Type_getSomething(int id); //or some other complex series of instructions

#define g(id) Type_getSomething(id)

…schade, dass die Verwendung von eckigen Klammern bei Makros nicht möglich ist!

1394480cookie-checkOperatorüberladung in C

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy