2013-06-20 46 views
0

我想在预处理器指令中使用OpenMP代码,但编译代码时出现错误。 我想要做下面的事情。在预处理器指令中使用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

在SUM(x)之前放''#pragma omp parallel for reduction(+:sum)'' – 2013-06-20 13:33:49

回答

1

OpenMP 3.1 standard,第2.1节,说(重点煤矿):

为C/C OpenMP指令++与编译 预处理指令指定。

现在,无论是在C和C++中,你不允许在宏观扩张阶段推出新的预处理器宏,这就是为什么你得到一个错误。

例如在最新C++ standard draft(第16条),你会发现以下:预处理指令中

的预处理标记不 受到宏扩展,除非另有说明

其次通过一个非常类似于你的片段的例子:

In:

#define EMPTY 
EMPTY #include <file.h> 

第二行预处理的令牌序列不是 预处理指令,因为它不具有#在翻译阶段4开始开始,即使它的宏观EMPTY具有后也这样做已被替换。

无论如何,正如其他答案中所述,您可以获得与自C99和C++ 11以来使用_Pragma运算符所寻求的效果相同的效果。从相同的C的部分16.9 ++的示例标准草案:上 “.. \ listing.dir”

的#pragma列表

也可以表示为:

_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 )保留用于执行任何用途
  • 以下划线开头的每个名称都保留给实施以用作全局命名空间中的名称
+0

好的解释。我不需要阅读标准。我只能读你的答案。 – 2013-06-20 13:36:08

2

在C中,自C99以来,您有_Pragma运算符,它允许您在宏内放置杂注,例如,

#define SUM(_X_)       \ 
sum=0.0;         \ 
_Pragma("parallel for reduction(+:sum)") \ 
for (i = 0 ; i < 10 ; i++)    \ 
    sum += _X_[i] 

BTW,要小心,切勿将终止;在宏定义的结束。

+0

哇!这是一个更好的答案。我必须在sum = 0.0之后加上一个';',在SUM(_X_)之后加一个反斜杠,否则ti会起作用。我想知道它是否在MSVC中起作用。我现在无法测试它。 – 2013-06-20 18:33:14

+0

是的,它也可以用MSVC完成,但有点不同http://stackoverflow.com/questions/4782049/pragma-preprocessor-operator-in-visual-c – 2013-06-20 19:50:51