2010-08-10 8 views
5

Duplicar posibles:
or is not valid C++ : why does this code compile ?"y"/"o" ​​en lugar de "&&"/"||" en código C++ - ¿característica del compilador o error del programador?

Hola.

que he encontrado recientemente inusual código C++ escrito por otra persona:

bool operator != (Point p1, Point p2) 
{ 
    return p1.X != p2.X or p1.Y != p2.Y or p1.Z != p2.Z; 
}; 

por lo que yo puedo decir, or no se ha declarado en cualquier lugar, incluso como macros. También hay pocos and s en el código. Como resultado, el proyecto no se basa en VC2008 Express. La persona que me dio el código dijo que el autor ha estado usando el compilador mingw.

La pregunta: ¿es esta una característica del compilador no estándar (lo dudo), es parte de un nuevo estándar de C++ (no he estado viendo C++ 0x) o es un problema del programador (por ejemplo si el tipo se mudó de pascal, podría haber estado usando y/o en lugar de &&/|| por hábito, o porque cree que es más "legible").

Respuesta

15

Es parte de la norma C++. Por desgracia, Visual C++ no permite que una parte por defecto, y Microsoft’s answer to a bug report is “won’t fix, since nobody uses this.”

Para fijar Visual C++, you need to disable the Microsoft language extensions en el compilador, lo que se puede hacer con la opción de línea de comandos /Za.

Alternativamente, una solución simple es incluir el encabezado <ciso646> que define estas palabras clave para los compiladores no conformes.

(yo soy una de las pocas personas que prefieren este estilo, y estoy un poco enojado con Microsoft por obligarme a usar sopa ASCII en lugar de palabras inglesas, limpios para que mi código portable.)

+1

También prefiero este estilo, especialmente para 'no' que es mucho más legible que'! '. –

+4

El problema es que es tan raro ver esto, que cuando aparece cualquier programador inexperto va WTF y publica una pregunta en stackoverflow. Por lo tanto, en mi opinión, es una mala idea utilizar estos constructos porque hacen que el código sea más difícil de mantener (ya que realmente se debe buscar lo que significan). –

+0

@Martin ¿Preferirías que la gente usara dígrafos en su lugar? Estos nombres están destinados a personas que no tienen los símbolos necesarios en los teclados, o al menos esa fue la intención original. –

4

En realidad, es parte del estándar actual de C++ (consulte la sección 2.5/1), pero es posible que deba hacer algo para habilitarlos en su implementación particular.

He aquí una lista extraída del estándar, que pude haber atornillado en el proceso:

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