2010-08-11 9 views
8

que actualmente hacer lo siguiente y el compilador (MSVC2008 /, así como de 2010) no se queja sobre ello, pero no estoy seguro de si se trata de una mala idea o no:¿Hay tokens después de #endif legal?

#ifndef FOO_H_ 
#define FOO_H_ 

// note, FOO_H_ is not a comment: 
#endif FOO_H_ 

Solía ​​escribir siempre es como #endif // FOO_H_ pero me di cuenta de que no lo hacía hoy y pensé que era extraño porque aparentemente no he hecho el método de comentarios por un tiempo.

¿Es esta una mala práctica que debería volver a todos mis encabezados y corregir (es una aplicación multiplataforma) o está bien dejarlo como está?

+0

Recibo una advertencia con GCC (tokens adicionales), así que no lo sugeriría. – UncleBens

+0

Estaba tratando de preguntar si es aceptable hacer algo en lo que respecta al estándar, o si se trataba de una implementación específica u otra cosa, no estoy muy seguro. Tal vez la mejor redacción habría sido "¿es esto correcto?" - De cualquier manera, no quiero advertencias cuando la aplicación se compila en otros sistemas operativos, así que los eliminaré, gracias. –

+0

@Joe: Lo siento, leí la pregunta mal. – GManNickG

Respuesta

6

Estrictamente hablando (de acuerdo con la gramática del estándar) no se permiten tokens siguiendo la directiva #endif en la misma línea (los comentarios son correctos ya que se eliminan en una fase anterior de la traducción que las directivas de preprocesamiento fase 3 vs. 4).

Sin embargo, parece que MSVC lo permite. No iría en busca de solucionar esto (ya que no están causando problemas), pero probablemente tomaría una nota mental para corregirlos al modificar los encabezados que tenerlos.

Por supuesto, si sus otros compiladores soportados emiten diagnósticos sobre ellos, probablemente sea más urgente solucionarlos.

+0

Mi principal preocupación era que cuando la aplicación se transfiere a otros SO, podría causar algo si no se permite este comportamiento, y como no lo está, solo lo arreglaré. No debería tomar todo ese tiempo realmente de todos modos. ¡Gracias! –

5

No está bien, no es válido, AFAIK. Muchos compiladores ignoran el texto adicional después del #endif y a menudo lo advierten. Debe agregar // para que sea un comentario.

+0

Bien, no estoy buscando advertencias, así que volveré a solucionarlo, ¡gracias! –

4

Con lo que todos los demás publicaron, pensé que podría ayudarte a corregir el problema. (suponiendo que está en muchos archivos.)

Puede usar la función Buscar y reemplazar en el estudio visual para corregir todas las líneas problemáticas a la vez. Simplemente configure Buscar qué: a "\#endif {[a-zA-Z\.\_]+}$" y Reemplazar con: a "#endif //\1" (y asegúrese de que tiene Uso: [Expresiones regulares] marcadas en las opciones de búsqueda.)

Y haga eso en la solución completa y debería estar listo.

(Por favor, copia de seguridad de su proyecto en primer lugar, he probado esto y parece estar funcionando según lo previsto, pero Utilice esta bajo su propio riesgo.)

+0

Oh, eso es increíble, no tenía idea de que pudieras usar expresiones regulares en la caja de buscar y reemplazar. Aunque no soy muy bueno con ellos, me está diciendo "Error de sintaxis en el patrón" y destacando "#endif {[a-zA-Z ._] +} $" - ¿Estoy haciendo algo incorrecto? - editar: Oops, no se puede usar el # allí o lo rompe. Está funcionando ahora, ¡muchas gracias! –

+0

debe haber barras (\) delante del #,. y _. ¿No estás seguro de por qué fueron eliminados? (como este: \ #endif {[a-zA-Z \. \ _] +} $) – TJMonk15

+0

@ Joe.F Eliminó el que estaba antes de _ allí a. No estoy seguro por qué. Solo vuelve a agregarlo y estarás bien. – TJMonk15

1

Por qué el compilador debe advertirle al respecto.

Digamos que su archivo de cabecera es la siguiente:

#ifndef X 
#define X 
// STUFF 
// The next line does not contain an EOL marker (can happen) 
#endif 

Ahora se incluye este de la fuente

#include "plop.h" 
class X 
{ 
} 

Cuando el compilador incluye el archivo técnicamente la fuente ampliado debería tener este aspecto

#define X 
// STUFF 
// The next line does not contain an EOL marker (can happen) 
#endif class X 
{ 
} 

La mayoría de los compiladores modernos tienen en cuenta que esto podría pasar y agregan un EOL extra token en los archivos incluidos para evitar que esto suceda (técnicamente no está permitido, pero no puedo pensar en una situación en la que podría causar un problema).

El problema es que algunos compiladores antiguos no proporcionan este token adicional (más estándares compatibles) pero como resultado, puede terminar compilando el código anterior (como resultado, tienden a advertirle sobre dos cosas 1) falta de EOL en los archivos fuente y 2) cosas después del #endif

Cuestiones relacionadas