Wie können Sie zwei Zeichenketten zum Zeitpunkt der Kompilierung statisch vergleichen?

9

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.

    
Avner Barr 15.12.2014, 18:40
quelle

4 Antworten

8

Sie können dies mit C ++ 11 tun, indem Sie eine Funktion constexpr verwenden:

%Vor%

( 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.

    
cdhowie 15.12.2014, 18:45
quelle
4

Sie können constexpr -Funktionen verwenden. Hier ist der C ++ 14 Weg:

%Vor%

Demo .

    
Columbo 15.12.2014 18:44
quelle
1

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

    
NathanOliver 15.12.2014 18:54
quelle
-1

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.

    
tmlen 15.12.2014 18:44
quelle