Использование прагмы openmp внутри #define

Возможные дубликаты:
C / C++ прагма в определении макроса
Условная "прагма омп"

Как я могу использовать прагмы OpenMP внутри определения макроса? Например

#define A() { \
 ...a lot of code... \
 #pragma omp for     \
 for(..)             \
  ..do_for..         \
 ...another a lot of code \
 }

3 ответа

Решение

Как здесь ответили Условно "Pragma omp"

С99 имеет _Pragma Ключевое слово, которое позволяет вам разместить то, что в противном случае было бы #pragma внутри макросов. Что-то вроде

  #define OMP_PARA_INTERNAL _Pragma("omp parallel for")

Так,

#define OMP_PARA_FOR _Pragma("omp for")
#define A() { \
 ...a lot of code... \
 OMP_PARA_FOR     \
 for(..)             \
  ..do_for..         \
 ...another a lot of code \
 }

несколько _Pragmas можно комбинировать как унарный оператор, например:

_Pragma("first pragma") _Pragma("Second pragma")

В Visual Studio вы можете использовать __pragma ключевое слово вместо #pragma, К сожалению, это нестандартно, поэтому вам придется выяснить, поддерживает ли ваш компилятор нечто подобное, если вы используете другой компилятор.

Вы не можете, потому что # внутри макроса есть другое значение (чтобы добавить кавычки (#somevar) или конкатетные переменные (onevar ## anothervar)). Если у вас есть более сложный код, который вы хотите включить вместо вызова функции, используйте локальную функцию и добавьте inline ключевое слово, так что оно встроено так же, как макрос будет встроен. Вам просто нужно передать переменные, используемые внутри, в качестве параметров (в виде указателей или ссылок). В качестве альтернативы вы можете использовать #include включить файл кода, содержащий только ваш макрос код.

Другие вопросы по тегам