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
?
Amigo, tan obvio. :) –
Si fuera tan obvio, ¿por qué fue como la vigésima cosa que probé? :) –