2013-03-08 97 views
0

要在我們的代碼中設置所謂的功能標誌,我們使用外部文件。在那裏,我們定義宏如何避免與OpenMPI的名稱衝突?

#define LB 

我們只是移植我們的軟件,C++,然後錯誤來了,specificially這一個

/usr/local/openmpi-1.6.4/include/openmpi/ompi/mpi/cxx/constants.h:174:28: error: declaration does not declare anything [-fpermissive] 

看它在帶來了相應的文件,該文件的openmpi使用內部數據類型稱爲LB

OMPI_DECLSPEC extern const Datatype LB; 

如何避免名稱衝突?重命名宏#define LB不是一個選項,因爲這會破壞向後兼容性。是否可以使用C - OpenMPI的接口與C++

+0

一個可能的骯髒的黑客可能是'#define LB LB'。 – 2013-03-08 10:56:24

+1

最簡潔的方法是確保'#define'出現在翻譯單元中的#includeed OpenMPI標頭後面。 – 2013-03-08 11:06:48

+0

@Michael Wild:不幸的是,這是不可能的,因爲'mpi.h'被包含在太多的文件中,並且特徵標誌在開始時被解析以打開或關閉這些特徵。 – 2013-03-08 12:18:05

回答

0

人們可以通過使用宏

#define OMPI_SKIP_MPICXX 
1

LB是官方MPI C++綁定的一部分停用的openmpi C++綁定。如果不關閉整個C++綁定集,就無法關閉它。

但請注意,MPI「LB」位於MPI ::命名空間中。所以,你也可以讓你的LB是一個實際的常數(與使用#define) - 也許這樣的事情在你的頭文件:

extern const int LB; 

(然後你必須真正實例化const int的LB的地方,當然)

這將使一個LB常量在MPI命名空間之外,因此不會發生衝突。

+0

這是一個不錯的主意,但程序必須向後兼容。此外'#define LB'是用戶界面的一部分(用於在編譯時設置/取消設置功能)以及用戶討厭更改。 – 2013-03-10 23:57:16

+1

如果聰明/危險的解決方法沒有某種形式,您可能會被卡住。不幸的是,自1996年以來,MPI擁有MPI :: LB。如果您只使用C++而不是MPI C++綁定,則可以關閉Open MPI的C++綁定。 – 2013-03-11 11:35:52