2010-05-08 24 views
13

Supongo por # que es solo una utilidad de tiempo de compilación. ¿Cómo se puede usar en los programas C/C++?¿Cómo funciona #error en C/C++?

No encontré mucho al respecto en Internet. Cualquier enlace sería útil.

Respuesta

12

Hace que el compilador (o el preprocesador) emita el mensaje de error. En C++, también da mala forma a la unidad de traducción (es decir, hace que la compilación falle).

Si tiene varias macros que podrían definirse y quiere asegurarse de que solo se definan ciertas combinaciones de ellas, puede usar #error para hacer que la compilación falle si se define una combinación no válida.

También puede ser útil si quiere estar seguro de que algún bloque de código nunca se compila (por alguna razón).

+1

lo que quiere decir con "solo se definen ciertas combinaciones de macros". ¿Puedes citar un ejemplo? Gracias. – Moeb

+0

@cambr: por ejemplo, si tiene dos macros, 'DO_X' y' DO_Y' y desea asegurarse de que solo se establezca una a la vez, puede ajustar una directiva '# error' en un' #if (DO_X definido) && (definido DO_Y) 'bloque. –

+5

@cambr: Digamos que su empresa vende Slicer ™ y Dicer ™. Ambos productos usan 'blade.c', pero pasan diferentes macros a través del sistema de compilación para una funcionalidad ligeramente diferente. Entonces podría usar '#if SLICING ... #elif DICING ... #else #error Sin funcionalidad seleccionada por makefile. – Potatoswatter

2

Aquí hay un enlace a la documentación del preprocesador Gnu explicar los #error y #warning directivas: http://gcc.gnu.org/onlinedocs/cpp/Diagnostics.html

En particular:

La directiva #error hace que el preprocesador para informar de un error grave. Los tokens que forman el resto de la línea después de #error se usan como el mensaje de error.

Véase también this question sobre la portabilidad de estas directivas.

+4

La directiva' # error' es parte de los estándares del lenguaje C y C++ y es totalmente portable. '# warning' es una extensión de lenguaje específica de gcc. –

+0

@james, gracias por la aclaración. – UncleZeiv

9

Útil para verificar la configuración del compilador y verificar las combinaciones de valores de macro. Algunos ejemplos al azar:

#if !defined(_DLL) 
# error This code will only work properly when compiled with /MD 
#endif 

#if _WIN32_WINNT < 0x502 
# error Sorry, Windows versions prior to XP SP2 are not supported 
#endif 

#if defined(_APPLE) && defined(_LINUX) 
# error Conflicting operating system option selected, choose one. 
#endif 
+0

¿Realmente manejas el último en la práctica? ¿No es responsabilidad del usuario no ser un cerebro muerto y no usar banderas de compilador sin sentido? No puede verificar * todo * ... – Thomas

+3

Es solo un ejemplo. Tiende a agregar esto cuando tiene demasiadas llamadas de soporte. Boost está plagado de esto, por ejemplo. –

Cuestiones relacionadas