Когда прагма OpenMP используется как часть аргумента макроса, она заменяется неправильно. В этом коде:
#define make_body( ... ) { __VA_ARGS__ }
extern foo( int );
int main(){
make_body(
#pragma omp parallel for
for( int i = 0; i < 10; i += 1 ){
foo( i );
}
)
}
Я ожидаю, что он будет расширен до:
extern foo( int )
int main(){
{
#pragma omp parallel for
for( int i = 0; i < 10; i += 1 ){
foo( i );
}
}
}
Однако (согласно gcc -E) он расширяется до:
extern foo( int );
int main(){
#pragma omp parallel for
{
for( int i = 0; i < 10; i += 1 ){
foo( i );
}
}
}
Это правильное поведение? Как я могу получить ожидаемое поведение, желательно без изменения аргументов макроса? Это происходит со всеми прагмами? Это эффект вариативного макроса? Выполняют ли другие компиляторы ту же замену?
Использование gcc (Ubuntu 5.4.0-6ubuntu1~16.04.10) 5.4.0 20160609
{}
, как нормальный человек. - person John Bollinger   schedule 21.11.2018