In meinem C-Projekt gibt es eine Struktur, die von einem anderen Kollegen erstellt wurde und einige Funktionszeiger enthält:
Ich habe kein Recht, diese Struktur und die relativen Dateien zu ändern.
Jetzt codiere ich mit der Struktur.
Ich muss eine Funktion definieren, deren Rückgabetyp und Argumentliste mit tools.tool_a
identisch sein müssen.
Bedeutet, dass meine Funktion wie folgt sein muss:
Das Problem ist, dass sich die Struktur stark ändert, besonders die Rückgabetypen, zum Beispiel int
wird heute durch size_t
ersetzt, also muss ich meinen Code sehr ändern.
Ich weiß, dass decltype
in C ++ mir helfen kann, also möchte ich nur wissen, ob C etwas Äquivalentes hat?
Ich denke, ich kann Makro verwenden, aber ich weiß nicht wie, ich weiß nicht, ob es möglich ist oder nicht.
Ich entwickle einige Test-Tools für Linux-Kernel mit C.
Es gab viele Versionen von benutzerdefinierten Kernels, die von anderen Gruppen in meiner Firma stammen. Aus historischen Gründen verwendeten einige von ihnen int
, andere verwendeten size_t
oder ssize_t
und so weiter.
Wenn ich jetzt code, muss ich Folgendes tun:
Ich muss kommentieren und auskommentieren ...
Die vernünftige Lösung besteht darin, ein typedef
zu erzwingen. Wenn das nicht möglich ist und die Anzahl der alternativen Typen, die die Funktion haben könnte, wie es scheint, begrenzt ist, könntest du etwas mit C11 _Generic
kochen.
Anstatt eine einzige Funktion namens my_func
zu erstellen, erstellen Sie mehrere Funktionen mit unterschiedlichen Namen. Präfix ihre Namen in Abhängigkeit vom Rückgabetyp. Dann haben Sie ein Makro, das wiederum basierend auf dem übergebenen Typ auf die entsprechende Funktion umleitet.
Beispiel:
%Vor% Hier habe ich ein zusammengesetztes Literal (struct tools){0}.tool_a
verwendet, um ein Dummy-Objekt desselben Typs wie tool_a
zu erstellen, und dann das Makro an das Makro übergeben, das die entsprechende Funktion auswählt. Wenn der Typ nicht unterstützt wird, tritt ein Compilerfehler auf, da keine übereinstimmende _Generische Verknüpfung gefunden werden konnte.
Nun, das ist nicht decltype
, aber wenn Sie Ihren Kollegen nur dazu bringen können , einen Typalias zu verwenden, können Sie Ihren statischen Typ überprüfen lassen.
Wenn Ihr Kollege davon überzeugt werden kann:
%Vor%Dann können Sie Ihre Funktionen wie folgt deklarieren:
%Vor%Und dein freundlicher Compiler wird dir sagen, ob es einen Prototyp-Mismatch gibt.