Funktion überladen in C mit GCC - Compiler Warnungen

8

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?

    
tjwrona1992 08.04.2016, 18:42
quelle

4 Antworten

7

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.

    
user2357112 08.04.2016, 19:07
quelle
2

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%     
M Oehm 08.04.2016 19:31
quelle
1

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

    
Harry 09.04.2016 03:35
quelle
0

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:

%Vor%

Ich hoffe wirklich, dass jemand eine bessere Lösung findet, weil sich das einfach falsch anfühlt ...

    
tjwrona1992 08.04.2016 18:57
quelle