Ich möchte ein Makro erstellen, das 2 Zeichenfolgen vergleichen und einen Fehler bei der Kompilierung ausgeben kann, wenn die Bedingung nicht erfüllt ist. Dies könnte als eine Kompilierzeit Assertion sein.
Ich bin nicht sicher, wie ich das machen könnte.
Zum Beispiel:
%Vor%Das Makro würde ungefähr wie
aussehen %Vor%Ich denke also, die Frage läuft darauf hinaus, dass wir die 2 Strings zum Zeitpunkt der Kompilierung vergleichen können.
Sie können dies mit C ++ 11 tun, indem Sie eine Funktion constexpr
verwenden:
( Siehe eine Demo )
Es ist nicht möglich, dies vor C ++ 11 zu tun, mit der Einschränkung, dass viele Compiler gleiche String-Literale kompilieren, um ein Zeiger auf denselben Ort zu sein. Bei diesen Compilern ist es ausreichend, die Strings direkt zu vergleichen, da sie beide als gleichwertige Zeiger ausgewertet werden.
Dies kann in C ++ 11 mit constexpr erfolgen. Durch Definieren einer rekursiven Funktion können Sie überprüfen, ob die Zeichenfolge gleich ist oder nicht.
%Vor%Dieser Code, den ich dank Johannes Schaub verwendet habe, und ihr könnt die vollständige SO-Post hier sehen
Ich glaube nicht, dass es möglich ist, zwei String-Literale bei der Kompilierung mit einem Makro zu vergleichen.
Wenn das Makro zu einer normalen for
-Schleife ausgewertet wird, die die Strings vergleicht, wird es wahrscheinlich von einem guten Compiler zu einer Konstanten optimiert, wenn die beiden Strings Konstanten sind.
Seit C ++ 11 kann es mit einer constexpr
-Funktion anstelle eines Makros gemacht werden. Seit C ++ 14 kann der consExpr eine Schleife enthalten, in C ++ 11 muss es im Grunde eine einzige return <expression>
-Anweisung sein. Aber kann mit einem rekursiven Ausdruck wie in der Antwort unten getan werden.
Tags und Links macros c++ xcode gnu compiler-errors