Я пытаюсь сделать что-то похожее на другой вопрос , а именно условно включить прагмы OpenMP в мою программу.Однако я хочу сделать еще один шаг и избежать того, чтобы пользователю приходилось указывать omp
каждый раз, когда они используют прагму.Другими словами, я хочу, чтобы следующий код компилировался:
#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());
}
}
К сожалению, это не работает.Компилятор жалуется:
ошибка: _Pragma
принимает строковый литерал в скобках
Если я использую следующую форму, она работает, хотя:
#define LIB_PRAGMA_OMP(x) _Pragma(#x)
…
LIB_PRAGMA_OMP(omp parallel) …
Однако я бы очень хотел избежать этой избыточности. Как правильно вставить (строковые) токены в оператор _Pragma
?