2017-11-09 13 views
0
이 같은 예를 들어 일부 충돌 처리기 함수 정의가 들어 대규모 프로젝트가

:재정의 여러 충돌 처리기 정의 세계적으로

1.h :

#define CONFLICTINGMACRO(a, b) {doSomething(a, b)} 

2.h :

#define CONFLICTINGMACRO(a, b, c) {doSomethingElse(a, b, c)} 

일부 파일은 두 헤더를 모두 가져 오지만 잘못된 내용 (먼저로드 된 내용)을 찾습니다.

I (재) 다른 기호를 정의하는이 파일은 컴파일러를 통해 프로젝트의 모든 소스 파일에 전 세계적으로 추가됩니다

redefinitions.h라는 파일에서 프로젝트의 (리눅스에서 사용할 수 없습니다 예를 들어, 윈도우 기능 및 유형) 플래그 : 다른 기능의 빠르고 쉬운 디버깅을 위해

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -include redefinitions.h") 

(내가 지금 충돌하는 매크로를 필요가 없습니다) 나는 redefinitions.h에 다음 줄을 추가하는 시도 :

#ifdef CONFLICTINGMACRO 
    #undef CONFLICTINGMACRO 
#endif 
#define CONFLICTINGMACRO(...) {} 

불행히도 이것은 차이를 만드는 것 같지 않습니다. 가장 좋은 추측은 * .h 파일이로드되는 순서와 관련이 있다는 것입니다.

전체 프로젝트에 대해 프로젝트의 다른 헤더 파일에 정의 된 매크로를 무시하는 방법에 대한 아이디어가 있습니까?

+0

아마도'1.h'와'2.h' 파일을 편집 할 수 없습니까? – Smeeheey

+0

불행히도 수천 개의 파일에 퍼져있는 수많은 갈등이 있습니다. (이유를 묻지 말고, 나 자신은 여전히이 엉망으로 다소 깜짝 놀랐습니다 ...) 편집하거나 편집하기위한 스크립트를 작성하는 데에는 상당한 시간이 걸릴 것입니다 (물론 미래에해야 할 일입니다). –

+0

컴파일러에게 특정 (예 : 이름으로) 매크로 정의를 무시하도록 알리는 방법을 모르겠습니다. – Tsyvarev

답변

2

쉬운 방법은 없습니다. 소스 자체의 편집이나 전처리를 배제한다면, 이식성을 포기하고 gcc를 고수하더라도 소스를 편집하거나 전처리하는 것을 배제한다면 그것을 달성하는 것은 불가능합니다. the reference에서 :

-include 파일

프로세스 파일처럼 "사용법 #include"파일 "" 기본 소스 파일의 첫 번째 줄 등장. (...) 등으로

, 당신의 redefinition.hCONFLICTINGMACRO을 정의하려고 다른 모든 헤더 위에 포함됩니다. 동일은 약 -D-U입니다. 모든 매크로 재정의는 일반적으로 마지막으로 본 것입니다. 이러한 동작을 무시할 수있는 전 처리기 옵션이 없습니다.

또 다른 해킹 포함 된 모든 헤더 파일의 전체 파일 트리를 복사하는 것 (예를 들어, 포함/-> include_wrapper /)를 입력 한 다음 다음과 같은 내용에 모든 파일을 수정 : 그럼

#include_next __FILE__ 
#ifdef CONFLICTINGMACRO 
    #undef CONFLICTINGMACRO 
#endif 
#define CONFLICTINGMACRO(...) {} 

다른 디렉토리보다 먼저 include 디렉토리 (include_wrapper /)를 설정하십시오. 이런 식으로, 당신은 기본적으로 wrapped 헤더가 포함될 때마다 매크로를 넣는 것입니다 (#undef). 물론 #include_next은 매우 흔하지 않은 전 처리기 확장이기 때문에 이식성을 희생 할 것입니다.

+0

나는 당신의 대답을 일찍 만 보았습니까? 그 동안 나는 정의 문을 편집하는 pyhon sript를 작성하기 시작했습니다. Man ... 충돌하는 매크로가 있다는 것만으로는 충분하지 않습니다. 대부분은 인식 할 수없는 패턴을 따르는 서식을 사용하여 여러 줄로 분산되어 있으므로 간단한 바꾸기를 수행 할 수 없습니다. 작업하는 사람 이 코드는 Visual C++로 잘 컴파일한다고 주장합니다. 내 말은, 정말로?! 어쨌든 고맙습니다. 스크립트를 작성하는 데 너무 오래 걸리는 경우 솔루션을 사용해 보겠습니다. –