2011-09-30 13 views
5

Estoy intentando hacer algo similar al another question, es decir, incluir condicionalmente pragmas OpenMP en mi programa. Sin embargo, quiero ir un paso más allá y evitar que el usuario necesite especificar omp cada vez que use el pragma. En otras palabras, quiero compilar el siguiente código:Pegado del token de preprocesador en el operador _Pragma de GCC

#include <cstdio> 
#include <omp.h> 

#ifdef _OPENMP 
# define LIB_PRAGMA_OMP(x) _Pragma("omp " #x) 
#else 
# define LIB_PRAGMA_OMP(x) 
#endif 

int main() { 
    LIB_PRAGMA_OMP(parallel) { 
     std::printf("Hello from thread %d\n", omp_get_thread_num()); 
    } 
} 

Lamentablemente, esto no funciona. El compilador se queja:

error: _Pragma takes a parenthesized string literal

Si utilizo el siguiente formulario, funciona, sin embargo:

#define LIB_PRAGMA_OMP(x) _Pragma(#x) 

… 

LIB_PRAGMA_OMP(omp parallel) … 

Sin embargo, realmente gustaría evitar esta redundancia. ¿Cómo puedo pegar los tokens (stringified) correctamente dentro del operador _Pragma?

Respuesta

8

Después de mucho ensayo y error, resulta que la solución más simple funciona:

#ifdef _OPENMP 
# define LIB_PRAGMA_OMP(x) DO_PRAGMA(omp x) 
# define DO_PRAGMA(x) _Pragma (#x) 
#else 
# define LIB_PRAGMA_OMP(x) 
#endif 

Con -DOPENMP, me sale:

# 12 "test_op.cpp" 
#pragma omp parallel 
# 12 "test_op.cpp" 

Y sin ella, nada.

+0

Amigo, tan obvio. :) –

+2

Si fuera tan obvio, ¿por qué fue como la vigésima cosa que probé? :) –

Cuestiones relacionadas