Вставка токенов препроцессора в оператор _Pragma в GCC

Я пытаюсь сделать что-то похожее на другой вопрос, а именно, условно включить прагмы 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?

6
задан Community 23 May 2017 в 12:33
поделиться