2013-06-20 79 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