C entspricht C ++ decltype

8

In meinem C-Projekt gibt es eine Struktur, die von einem anderen Kollegen erstellt wurde und einige Funktionszeiger enthält:

%Vor%

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:

%Vor%

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.

REALER FALL

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:

%Vor%

Ich muss kommentieren und auskommentieren ...

    
Yves 10.01.2018, 07:56
quelle

2 Antworten

7

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.

    
Lundin 10.01.2018, 08:47
quelle
5

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.

    
StoryTeller 10.01.2018 08:03
quelle

Tags und Links