2013-03-08 89 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