Frage

Ich habe das gerade gelesen schönes Stück von Reddit.

Sie erwähnen and Und or als „Alternative Tokens“ zu && Und ||

Das war mir bisher wirklich nicht bewusst.Natürlich kennt das jeder Di-Graphen und Tri-Graphen, Aber and Und or?Seit wann?Handelt es sich hierbei um eine neue Ergänzung des Standards?

Ich habe es gerade mit Visual C++ 2008 überprüft und es scheint nichts anderes als einen Syntaxfehler zu erkennen.Was ist los?

War es hilfreich?

Lösung

MSVC unterstützt sie als Schlüsselwörter nur, wenn Sie die /Za Option Erweiterungen deaktivieren; Dies ist aus mindestens VC7.1 (VS2003) wahr.

Sie können sie als Makros, indem iso646.h unterstützt erhalten.

Meine Vermutung ist, sie glauben, dass sie Schlüsselwörter standardmäßig machen würde brechen zu viel vorhandenen Code (und ich wäre nicht überrascht, wenn sie rechts).

Dies wurde am SO her irgendwo hier in einer Frage ein paar Wochen besprochen, aber ich kann nicht so die Suche oder Google bekommen das verdammte Ding zu finden.

Andere Tipps

Aus der C ++ 11-Standard, 2.6/ Alternative tokens:

  1. Alternative Token Darstellungen sind für einige Operatoren und Interpunktionszeichen zur Verfügung gestellt.
  2. In jeder Hinsicht der Sprache, jede Alternative Token verhält sich gleich, jeweils als primäre Token, mit Ausnahme seiner Rechtschreibung. Der Satz von alternativen Token ist in Tabelle 2 definiert.

Tabelle 2 - Alternative Token

alternative primary | alternative primary | alternative primary
--------------------+---------------------+--------------------
   <%          {    |    and         &&   |    and_eq      &=
   %>          }    |    bitor       |    |    or_eq       |=
   <:          [    |    or          ||   |    xor_eq      ^=
   :>          ]    |    xor         ^    |    not         !
   %:          #    |    compl       ~    |    not_eq      !=
   %:%:        ##   |    bitand      &    |

Um tatsächlich die Frage zu beantworten:

Sie wurden in dem ersten C ++ Standard definiert.

Sehen Sie den C ++ Standard. Der Komitee-Entwurf # 2 ist frei verfügbar unter ftp: //ftp.research.att .com / dist / c ++ std / WP / CD2 / body.pdf , obwohl es nicht-autoritative, out-of-date, und an einigen Stellen teilweise falsch. Insbesondere wird in Abschnitt 2.5, Alternative Tokens , sind die folgenden definiert:

Alternative Primary
<%          {
%>          }
<:          [
:>          ]
%:          #
%:%:        ##
and         &&
bitor       |
or          ||
xor         ^
compl       ~
bitand      &
and_eq      &=
or_eq       |=
xor_eq      ^=
not         !
not_eq      !=

Obwohl ehrlich gesagt, ich habe einen von ihnen nie außer für and, or verwendet gesehen, und not, und selbst dann, das sind selten. Beachten Sie, dass diese nicht standardmäßig zulässig sind einfach in C-Code, nur in C ++. Wenn Sie sie in C verwenden möchten, müssen Sie entweder sie selbst als Makros #define oder #include den Header <iso646.h>, die alle der oben genannten Ausnahme <% definiert >% <: :> %: %:%: als Makros (Abschnitt 7.9 des C99 sehen Standard).

Sie werden überrascht sein über den Rest von ihnen zu lernen:

and and_eq bitand bitor compl not not_eq or or_eq xor xor_eq

Liste von C ++ Keywords .

Ich glaube, dass neuere Versionen von GCC diese Keywords unterstützen.

Obwohl die Frage alt ist, möchte ich ihr eine mehr oder weniger vollständige Antwort geben:Alternative Token waren bereits Teil des derzeit zurückgezogenen C++98 (ISO/IEC 14882:1998, was meiner Meinung nach der erste ISO-Standard für C++ war).Obwohl dies kein Beweis an sich ist (und ich besitze keine Kopie von ISO für C++98), Hier ist ein Link – siehe Abschnitt C++.

Wie in den anderen Antworten erwähnt, verstößt der MSVC-Compiler gegen die Regeln [lex.digraph] Abschnitt der Norm wann /Za Flag ist nicht angegeben.

Die GNU Compiler g ++ hat sie, aber ich weiß nicht, über MS VC ++.

Sie können die gleiche Funktionalität erhalten, indem diese am Anfang der Codedatei setzen.

#define and &&
#define bitor |
#define or ||
#define xor ^
#define compl ~
#define bitand &
#define and_eq &=
#define or_eq ^=
#define xor_eq ^=
#define not !
#define not_eq !=

Obwohl diese irgendwie hackish ist, sollte es funktionieren.

Sie sind in dem Arbeitspapier für den neuen C ++ Standard, auf Seite 14: C ++ Standard-

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top