【发布时间】:2018-11-20 22:21:11
【问题描述】:
当 OpenMP pragma 用作宏参数的一部分时,它会被错误地替换。 在这段代码中:
#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
【问题讨论】:
-
我很好奇:真正的目标用例是什么?问题中给出的例子不可能是这样,因为像正常人一样输入文字
{}会更简单,更省事。 -
真正的用例是一个代码计时库,它在代码段周围插入计时器停止、启动和经过时间报告代码。到目前为止,它运行良好,但不幸的是这个 OpenMP 示例破坏了一些东西。为了解决这个问题,我将为这些单独的组件添加一些宏,因此代码部分不是宏参数。
标签: c gcc macros openmp variadic-macros