2010-01-23 10 views
25

¿Existe una directiva de pragma de GCC que detendrá, interrumpirá o abortará el proceso de compilación?GCC#pragma para detener la compilación

Estoy usando gcc 4.1 pero quisiera que el pragma también esté disponible en las versiones de gcc 3.x.

+1

Es posible que podamos brindarle una mejor respuesta si nos dice por qué desea que se detenga la compilación. – Michael

+0

¿Sigue siendo relevante la restricción en GCC 3-4.1? – ideasman42

Respuesta

38

Es posible que desee #error:

[email protected]:/tmp$ g++ -Wall -DGoOn -o stopthis stopthis.cpp 
[email protected]:/tmp$ ./stopthis 
Hello, world 
[email protected]:/tmp$ g++ -Wall -o stopthis stopthis.cpp 
stopthis.cpp:7:6: error: #error I had enough 
[email protected]:/tmp$ cat stopthis.cpp 

#include <iostream> 

int main(void) { 
    std::cout << "Hello, world\n"; 
    #ifndef GoOn 
    #error I had enough 
    #endif 
    return 0; 
} 
[email protected]:/tmp$ 
+0

Una limitación aquí es '# error' no se puede usar dentro de una macro, aunque la pregunta es vaga en cuanto a la finalidad. – ideasman42

+3

Pensé esto también, sin embargo, mi GCC (4.9) no se detiene con un error, continúa, obviamente no se compila pero no se detiene, ¿es esto un error o se puede confirmar? –

15

No sé acerca de un #pragma, pero #error debería hacer lo que quiera:

#error Failing compilation 

terminará compilación con el mensaje de error "A falta de compilación"

6

mientras que normalmente #error es suficiente (y portátil), hay momentos cuando desee utilizar un pragma, es decir, cuando desee ocasionalmente causar un error dentro de una macro.

Aquí es un ejemplo de uso que depende de C11 _Generic y _Pragma

En este ejemplo se asegura var no es una int * o una short * pero no un const int * en tiempo de compilación.

Ejemplo:

#define MACRO(var) do { \ 
    (void)_Generic(var, \ 
      int  *: 0, \ 
      short  *: 0, \ 
      const int *: 0 _Pragma("GCC error \"const not allowed\"")); \ 
    \ 
    MACRO_BODY(var); \ 
} while (0) 
1

Esto funciona:

#include <stophere> 

gcc se detiene cuando no puede encontrar el archivo de inclusión. Quería que gcc se detuviera si C14 no era compatible.

#if __cplusplus<201300L 
    #error need g++14 
    #include <stophere> 
#endif 
0

que puede utilizar:

#pragma GCC error "my message" 

pero no es estándar.

Cuestiones relacionadas