Próbuję zrobić coś podobnego do another question, mianowicie warunkowo włączam pragmy OpenMP do mojego programu. Jednak chcę pójść o krok dalej i uniknąć tego, że użytkownik musi określić omp
za każdym razem, gdy używają pragmy. Innymi słowy, chcę skompilować następujący kod:Wklejanie tokena preprocesora w operatorze GCC _Pragma
#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());
}
}
Niestety, to nie działa. Kompilator narzeka:
error:
_Pragma
takes a parenthesized string literal
Gdybym skorzystać z poniższego formularza, to działa, choć:
#define LIB_PRAGMA_OMP(x) _Pragma(#x)
…
LIB_PRAGMA_OMP(omp parallel) …
Jednak ja naprawdę chciałbym uniknąć tego zwolnienia. Jak mogę poprawnie wkleić żetony (uszeregowane) wewnątrz operatora _Pragma
?
Stary, taki oczywisty. :) –
Jeśli to było tak oczywiste, dlaczego było to jak 20 rzeczy, którą próbowałem? :) –