Dies wird mit C1X möglich sein, aber nicht im aktuellen Standard.
Es wird so aussehen:
%Vor% Variablentypen sind dem Compiler bekannt, nicht jedoch dem Präprozessor (der den Code einfach als unstrukturierten Text bezeichnet) und nur einfache Ersetzungsoperationen ausführt. Ich fürchte, Sie können das nicht mit C-Makros erreichen.
In C ++ haben sie Vorlagen erfunden, um solche Probleme zu lösen (und mehr).
Sie können die Eigenschaften der Typen testen.
Beispielsweise kann int
einen negativen Wert enthalten, während char*
dies nicht kann. Also, wenn ((typeof(param))-1) < 0
, param
unsigniert ist:
Der Compiler optimiert dies offensichtlich.
Versuchen Sie es hier: Ссылка
Dies wäre noch einfacher, wenn die Typen unterschiedliche Größen hätten. Wenn Sie beispielsweise ein generisches Makro schreiben möchten, das verschiedene Zeichengrößen verarbeiten kann:
%Vor% GCC hat eine __builtin_types_compatible_p()
eingebaute Funktion, die überprüft werden kann für die Kompatibilität der Typen:
Versuchen Sie es hier: Ссылка
Sie können dies in ein Makro einfügen, um das zu erreichen, was Sie tun möchten:
%Vor% (Das ({...})
ist ein GCC-Statement-Ausdruck , erlaubt es einer Gruppe von Aussagen, ein rvalue zu sein.
Der __builtin_choose_expr()
Built-in kann den zu kompilierenden Ausdruck auswählen . Mit __builtin_types_compatible_p kann ein Fehler zur Kompilierzeit ausgelöst werden, wenn der Param-Typ nicht sowohl mit int
als auch mit char*
kompatibel ist: (durch Kompilieren von sashting in diesem Fall ungültig)
Dies ist ein leicht abgewandeltes Beispiel aus __builtin_choose_expr docs .
Es gibt keine Möglichkeit, in C89 / ANSI C Zeitprüfungsarten auszuführen, aber es gibt eine Erweiterung für gcc, die dies zulässt. typeof oder etwas in diesen Zeilen, wenn ich mich erinnere. Ich habe es einmal im Linux Kernel gesehen.
In kernel.h :
%Vor%Sehen Sie sich diesen Artikel an: GCC-Hacks im Linux-Kernel
Als ich das zum ersten Mal gesehen habe, habe ich hier eine Frage zu SO gestellt:
Ich bin mir nicht ganz sicher, wie genau du es benutzen würdest, um dein Problem zu lösen, aber es ist etwas, das einen Blick wert ist.
Variablentypen sind tatsächlich zur Kompilierzeit bekannt, jedoch findet vor der Kompilierung eine Makroexpansion statt. Ich schlage vor, dass Sie 2 überladene Funktionen anstelle eines Makros implementieren.
Tags und Links macros c types generic-programming