Ich versuche, Funktionsüberladung in C zu implementieren, und ich bin sehr nah dran. Ich verwende C99, daher ist das in C11 eingeführte _Generic
-Schlüsselwort für mich nicht verfügbar. Ich habe einen Arbeitscode entwickelt, aber wenn ich ihn kompiliere, bekomme ich ein paar Warnungen.
Arbeitsbeispiel:
%Vor%Das Kompilieren erstellt die folgenden Warnungen:
%Vor%Für ein wenig mehr Debugging-Informationen, hier ist, was die Hauptfunktion aussieht, nachdem der Präprozessor seine Arbeit erledigt:
%Vor%Wie kann ich veranlassen, dass die Kompilierungswarnungen weggehen und noch funktionierender Code haben?
In der Theorie sollte das funktionieren:
%Vor% Er wählt entweder print_int
oder print_string
und wendet dann die gewählte Funktion auf x
an.
Die GNU-Seite der Build-Ins besagt, dass die nicht ausgewählten Zweige möglicherweise noch generiert werden Syntaxfehler, aber ich sehe nicht, wie nicht übereinstimmende Typen Syntaxfehler sind.
Wie auch immer, Sie können die Warnungen loswerden, wenn Sie die Argumente in die Funktion außerhalb der typabhängigen Auswahl verschieben. Also (im Pseudocode, um es lesbarer zu machen), anstatt
%Vor%tue
%Vor% Das hat user2357112 in einem Kommentar vorgeschlagen. Ich arbeitete an einer ähnlichen Lösung, aber ich hatte Mühe, den Standardteil ( pass
oben) zu erhalten. Wenn ich (void)
verwende, was dann zu (void)(x)
erweitert werden soll, erhalte ich einen Fehler bezüglich einer nicht passenden Klammer.
Die folgende Lösung erstellt eine Standarddruckfunktion, die ihre Argumente nicht verwendet. Es könnte wahrscheinlich eine nicht existierende Funktion sein, so dass es Probleme beim Verknüpfen oder etwas anderes gibt, das einen Fehler erzeugt.
%Vor%Hier ist ein Beispiel mit mehreren Methoden, die das Überladen von Funktionen erreichen.
Ein Poster hat das erwähnt
Die GNU-Seite auf den Build-Ins sagt, dass die Zweige nicht gewählt werden dürfen weiterhin Syntaxfehler, aber ich sehe nicht, wie nicht übereinstimmende Typen sind Syntaxfehler.
Die Syntaxfehler, auf die sie sich beziehen Ich glaube, die Compilerwarnungen, die Sie bekommen, weil der Compiler nach der Vorverarbeitung sehen kann, dass die Typen der Argumente für einige Funktionen falsch sind, auch wenn sie niemals aufgerufen werden können. Die Lösung (die ich ziemlich gut finde) besteht darin, eine Möglichkeit zu finden, die Typen vor dem Compiler zu verbergen. Der offensichtliche Weg ist varargs, der weniger offensichtliche Weg ist die aktuelle Antwort auf die Frage des OP.
Vorbehalte gelten, dh nicht alle Lösungen sind typsicher und dies ist ganz spezifisch für GNU ...
%Vor%Die Quelle ist auf GitHub ...
Die switch-Methode mit mehreren Argumenten finden Sie hier ...
Das ganze
Die Warnung kann unterdrückt werden, indem in der #define
-Sektion ein Casting durchgeführt wird, aber ich denke, das ist wahrscheinlich nicht die beste oder gar eine gute Lösung ...
Ändern Sie die Funktionsaufrufe im Abschnitt #define
wie folgt:
Ich hoffe wirklich, dass jemand eine bessere Lösung findet, weil sich das einfach falsch anfühlt ...
Tags und Links c c99 compiler-warnings c-preprocessor function-overloading