2013-05-09 1 views
0

Если бы я хотел определить первый идентификатор прагмы, как бы я это сделал?Как использовать расширение макроса для первого идентификатора прагмы?

Например, мне нужно что-то вроде этого, чтобы работать как OpenMP Pragma:

#define FOO omp 
#pragma FOO parallel 

Так что мне это нужно, чтобы быть истолковано как:

#pragma omp parallel 

Я использую GCC в Linux. Из того, что я читал до сих пор, похоже, что это не поддерживается. Есть ли какое-нибудь решение?

+0

Я не думаю, что препроцессор обрабатывает прагмы, а это означает, что вы не можете делать то, что хотите. –

+0

@JoachimPileborg Не '# pragma' - это предпроцессорная директива, как' # define' или '# include'. Я все ** что-то об этом зависит от компилятора? Препроцессор игнорирует' # прагма'? –

+0

@JoachimPileborg Я читал, что многие вещи о прагмах зависят от компилятора, но никогда не знали, что препроцессор вообще не обрабатывает прагмы. Это так? –

ответ

4

С C99 у нас есть оператор _Pragma, который в основном позволяет размещать содержимое #pragma везде, причем не только по отдельной строке, но и для ее макрообъектива. Что-то вроде

#define STRINGIFY_(...) #__VA_ARGS__ 
#define STRINGIFY(...) STRINGIFY_(__VA_ARGS__) 
#define FOO omp 
#define PARALLEL(...) _Pragma(STRINGIFY(FOO parallel __VA_ARGS__)) 

, а затем

PARALLEL(private(a)) 
for(size_t i = 0; i < NUM; ++i) 
    .... 

должен сделать трюк.

Если вы просто заинтересованы в использовании такого материала (по сравнению с написания макросов) можно использовать P99 preprocessor blocks, который реализует такие вещи, как P99_PARALLEL_FOR и P99_PARALLEL_FORALL с такого рода трюков.

+0

Я пробовал это и несколько его вариантов , но линия все еще заканчивается тем, что интерпретируется как '#pragma FOO parallel' – Chris

+0

@ Крис, вам жалко, вам придется сделать еще один уровень расширения макросов, см. мое редактирование. –

+0

Для меня это интерпретируется как: '#pragma" FOO parallel __VA_ARG__ " ' Вы компилируете с помощью gcc? – Chris

Смежные вопросы