2011-09-30 15 views
5

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?

Odpowiedz

8

Po wielu próbach i błędach, okazuje się, że najprostsze rozwiązanie działa:

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

Z -DOPENMP, otrzymuję:

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

a bez niego nic.

+0

Stary, taki oczywisty. :) –

+2

Jeśli to było tak oczywiste, dlaczego było to jak 20 rzeczy, którą próbowałem? :) –

Powiązane problemy