Pregunta

He intentado buscar en la documentación e Internet lo mejor que puedo, pero no he podido hacer que el compilador Xcode emita una advertencia si el operador de asignación se usa en una declaración if.

Vengo de RealBasic, donde tengo la fuerte costumbre de escribir este tipo de comparación:

if x = 5 then ...

En C, por supuesto, esa sintaxis asigna x el valor de 5, luego prueba el resultado para ver si es distinto de cero, y el " correcto " operador es:

if (x == 5) { ... }

He encontrado varias menciones que el compilador debería poder advertir si hay una asignación realizada en una comparación if, pero no puedo encontrar la forma de activarlo en Xcode 3.1 / gcc. Encontré la opción -pedantic , pero eso no pareció generar la advertencia.

Desde que he pasado una buena cantidad de tiempo ahora dos veces buscando errores que resultaron ser " = " En lugar de " == " ;, me gustaría recibir la ayuda de una advertencia.

Sé que puedo hacer esto en su lugar (lo que provocará un error de compilación):

if (5 = x) { ... }

... pero eso también requiere cambiar los hábitos de codificación arraigados. Sin mencionar que se ve torpe y hacia atrás.

¡Gracias!

¿Fue útil?

Solución 2

El enlace en la respuesta de ennuikiller condujo a lo que necesitaba.

Aquí hay un poco más de información para cualquier persona que pueda encontrar esto en el futuro:

  • La advertencia del compilador es " Aparecen llaves y paréntesis " ;, o -Wparentheses.

  • La advertencia se activa al seleccionar Obtener información para el actual objetivo en Xcode.

  • Como finalmente lo descubrí, el iPhone Simulator SDK no se muestra esta opción del compilador.

  • Al cambiar el SDK al dispositivo iPhone, aparecerán las advertencias de GCC 4.2 sección, que incluye " Missing llaves y paréntesis " ;.

  • Después de activar esa opción en el iPhone Device SDK, vuelve a activar a la Similator muestra que una " Definido por el usuario " configuración de construcción ha sido adicional: GCC_WARN_MISSING_PARENTHESES = " SÍ " ;.

  • Si realmente se desea una asignación en una sentencia if, puede doble los paréntesis para evitar la advertencia.

(Ejemplo de paréntesis dobles :)

if ((x = 5)) { ... }

La advertencia funciona a la perfección, aunque no le gusta el estándar de Apple:

if (self = [super init]) { ... }

Probablemente los dejaré como están, aunque si termino con una gran cantidad de ellos en un proyecto, duplicaré el paréntesis o dividiré la tarea en una línea separada.

¡Gracias!

Otros consejos

Estás buscando la opción -Wall, creo.

int main(void) {

    int x = 5;
    if ( x=5) { 
    }
    return 0;
  }

$ g++ -pedantic x.cc 
$ g++ -Wall x.cc 
x.cc: In function ‘int main()’:
x.cc:7: warning: suggest parentheses around assignment used as truth value

Este enlace describe cómo habilitar las opciones a través de Xcode GUI

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top