2013-03-08 4 views
0

코드에서 소위 기능 플래그를 설정하기 위해 외부 파일을 사용합니다. 거기에서 우리는 정의 매크로 우리는 단지 C에 우리의 소프트웨어를 포팅 ++ 다음 오류는 OpenMPI 내부 데이터 유형을 사용하는 양육 해당 파일을 찾고 specificially이 하나OpenMPI와의 이름 충돌을 피하는 방법은 무엇입니까?

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

, 온

#define LB 

LB이라고합니다.

OMPI_DECLSPEC extern const Datatype LB; 

어떻게 이름 충돌을 피할 수 있습니까? #define LB 매크로의 이름을 바꾸면 이전 버전과의 호환성이 손상 될 수 있으므로 옵션이 아닙니다. C -Interface of OpenMPI를 C++과 함께 사용할 수 있습니까?

+0

가능한 더러운 해킹은 '#define LB LB'일 수 있습니다. –

+1

가장 깨끗한 방법은'# define'이 번역 단위의'#includeed' OpenMPI 헤더 뒤에 나타나는지 확인하는 것입니다. –

+0

@Michael Wild : 안타깝게도 'mpi.h'가 너무 많은 파일에 포함되고 기능 플래그가 처음에 구문 분석되어 기능을 설정하거나 해제 할 수 없으므로 불가능합니다. –

답변

0

하나는 매크로

#define OMPI_SKIP_MPICXX 
1

LB 공식 MPI C++ 바인딩의 일부를 사용하여 OpenMPI 실행 C++ 바인딩을 사용하지 않도록 설정할 수 있습니다. 전체 C++ 바인딩 집합을 끄지 않고 해제 할 수는 없습니다.

그러나 MPI "LB"는 MPI :: namespace에 있습니다. 그래서 당신은 또한 당신의 LB가 (정의 # 대) 실제 일정 만들 수 - 헤더 파일이 같은 아마 뭔가 :

extern const int LB; 

(다음 실제로 어딘가 CONST의 INT LB를 인스턴스화해야 물론)

이렇게하면 MPI 네임 스페이스 외부에있는 LB 상수가되므로 충돌하지 않습니다.

+0

이것은 좋은 생각이지만 프로그램은 하위 호환이 가능해야합니다. 게다가'#define LB'는 (컴파일 할 때 기능을 설정/해제하는) 사용자 인터페이스의 일부이며 사용자는 변경 사항을 싫어합니다. –

+1

영리하고 위험한 해결 방법이 없다면 어떤 문제가 발생하지 않을 수 있습니다. 불행하게도 MPI는 1996 년부터 MPI :: LB를 가지고 있습니다. MPI C++ 바인딩이 아닌 C++ 만 사용한다면 Open MPI의 C++ 바인딩을 해제 할 수 있습니다. –

관련 문제