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