2010-03-10 11 views
25

Tengo algo de código que se parece a:¿Cuándo "y" convertirse en un operador en C++

static const std::string and(" AND "); 

Esto provoca un error en g ++, así:

Row.cpp:140: error: expected unqualified-id before '&&' token 

así que después de maldecir el tonto que definido "y" como & &, añadí

#ifdef and 
#undef and 
#endif 

y ahora tengo

Row.cpp:9:8: error: "and" cannot be used as a macro name as it is an operator in C++ 

¿Qué lleva a mi pregunta de CUÁNDO "y" se convirtió en operador en C++? No puedo encontrar nada que indique que es así, excepto, por supuesto, este mensaje de g ++

+7

Se introdujo por primera vez en C94, creo. Ver http://www.lysator.liu.se/c/na1.html. Si bien son macros en C, son operadores preprocesadores en C++, por lo que no puede '# definirlos. (No son palabras clave, técnicamente. Pero tampoco todas las palabras clave están reservadas de esa manera. Una que es, es 'new'. Una que no es, por ejemplo, es' sizeof'. Así que puedes '#define sizeof') –

+0

Para eso, observe este informe de problema: http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#369. Actualmente, un '# define' de' delete' o 'new' no está permitido. –

+2

Al igual que un FYI para los usuarios de MSVC, si desea que funcionen en MSVC, debe habilitar la opción '/ Za' para poner el compilador en modo ANSI estricto o debe incluir' iso646.h' (o 'ciso646') –

Respuesta

9

Hay several such alternatives se define en C++. Probablemente pueda usar interruptores para encender/apagar estos.

+1

El enlace está roto y el resto de la respuesta no servirá para nada como respuesta a esta pregunta. Aquí hay mejores respuestas, que deberían ser aceptadas. –

+3

Deadlink y la respuesta restante no sirve de nada. – Thesola10

+1

Deadlink corregido. – user1641854

3

No sé cuándo se presentó, bien puede haber estado allí desde el principio, pero creo que la razón por la que está allí es como una alternativa a && para las personas con conjuntos de caracteres restringidos, es decir, cuando en realidad no tienen el carácter de signo.

Hay muchos otros también, por ejemplo. and_eq, or, compl y not por nombrar sólo una selección.

+1

¿Qué hacen esas personas cuando necesitan un bitwise y (&)? – tloach

+4

@tloach: bitand – Troubadour

5

De acuerdo con C++ Standard 2.12 hay tokens de preprocesador predefinidos "que se utilizan en la sintaxis del preprocesador o se convierten en tokens para operadores y puntuadores". and es uno de ellos. En el nuevo estándar de C++ hay nueva 2,12/2:

Además, las representaciones alternativas que se muestran en la Tabla 4 para ciertos operadores y Signos de (2.6) están reservados y no se utilizarán de otro modo:

 
and and_eq bitand bitor compl not 
not_eq or or_eq xor xor_eq 
25

de la norma C++ 03, sección 2.5:

2,5 tokens alternativos

Se proporcionan representaciones de tokens alternativas para algunos operadores y puntuadores. En todos los aspectos de la lengua, cada ficha alternativa comporta de la misma, respectivamente, como su identificador primario, a excepción de su ortografía. El conjunto de símbolos alternativos se define en la Tabla 2.

fichas Tabla 2-alternativos

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

... Trigraphs: ¿la próxima generación? ... ¿Y definen 'not_eq' pero no' eq'? ¡La injusticia! –

12

Han estado ahí desde C++ 98. Están enumeradas en el § 2.5/2 de la norma (ya sea la edición de 1998 o la de 2003). Los tokens alternativos incluyen: and, or, xor, not, bitand, bitor, compl, and_eq, or_eq, xor_eq, not, not_eq.

8

Puede utilizar -fno-operator-names desactivar esto.¡Alternativamente, puede nombrar a su objeto std::string de otra manera!

3

Se agregaron porque algunos de esos caracteres son difíciles de escribir en algunos teclados.