我试图在预处理程序指令中使用OpenMP代码但是在编译代码时遇到错误。 我正在尝试做类似下面的事情。
#include<stdio.h>
#include<omp.h>
#define SUM(_X_)
sum=0.0 \
/*I want to put openmp
parallel for directive here \
i.e., #parallel for reduction(+:sum)\
*/ \
for (i = 0 ; i < 10 ; i++) \
sum += _X_[i]; \
int main()
{
int i=0,x[10];
float sum=0;
for(i=0;i<10;i++)
x[i]=i;
SUM(x);
}
有谁知道如何实现这一目标?
答案 0 :(得分:2)
在C中,从C99开始,你有_Pragma
运算符,允许你在微帧中放置编译指示,例如。
#define SUM(_X_) \
sum=0.0; \
_Pragma("parallel for reduction(+:sum)") \
for (i = 0 ; i < 10 ; i++) \
sum += _X_[i]
顺便说一句,要小心,不要在宏定义的末尾放置终止;
。
答案 1 :(得分:1)
OpenMP 3.1 standard第2.1节说明(强调我的):
使用pragma指定C / C ++的OpenMP指令 预处理指令。
现在,在C和C ++中,不允许在宏扩展阶段引入新的预处理器宏,这就是您收到错误的原因。
例如,在最新的C++ standard draft(第16节)中,您会找到以下内容:
预处理指令中的预处理标记不是 除非另有说明,否则须进行宏观扩张
后跟一个非常类似于您的代码段的示例:
在:
#define EMPTY EMPTY #include <file.h>
第二行上的预处理令牌序列不是a 预处理指令,因为它在转换阶段4开始时不以
#
开头,即使它在宏EMPTY
被替换后也会这样做。
无论如何,正如在其他答案中正确陈述的那样,从C99和C ++ 11开始,您可以获得与使用_Pragma
运算符所寻求的效果相同的效果。相同C ++标准草案的第16.9节中的一个例子:
#pragma列在“.. \ listing.dir”
上也可以表示为:
_Pragma ( "listing on \"..\\listing.dir\"" )
无论是否出现,后一种形式的处理方式都相同 字面上如图所示,或宏观替换的结果,如:
#define LISTING(x) PRAGMA(listing on #x) #define PRAGMA(x) _Pragma(#x) LISTING( ..\listing.dir )
最后,请注意选择你的名字,因为_X_
可能是为实现保留的名称(第17.6.4.3.2节):
始终保留某些名称和功能签名集 实施:
- 包含双下划线
__
或以下划线后跟大写字母(2.12)开头的每个名称都保留给实现以供任何使用- 以下划线开头的每个名称都保留给实现,以用作全局命名空间中的名称