2010-04-21 5 views
6

내 코드베이스에서 두 모듈의 이름이 동일한 구조가 있음을 발견했습니다. 이름 충돌 오류가 발생했습니다. 코드를 변경하지 않고 해결할 수 있습니까?같은 이름의 두 구조를 해결하는 방법은 무엇입니까?

+0

코드를 변경하는 것이 잘못된 이유는 무엇입니까? –

+0

내가 가질 수 있다면, 나는 가질 것입니다. :) 죄송합니다 닐, 제 경우에는 옵션이 아닙니다. 나는 두 개의 다른 모듈을 통합하려고하는데, 둘 다 내 통제에서 벗어나서 그것들을 일으키고있다. – Jay

답변

9

이 끔찍한 해킹,하지만 당신은 아마 모두 헤더가 제공하는 구조체의 이름을 변경하려는 것 때문에

// a.h 
struct collide { 
    int a; 
}; 

// b.h 
struct collide { 
    float b; 
}; 

// test.c 
#define collide a_collide 
#include "a.h" 
#undef collide 
#include "b.h" 
int main(){ 
    struct a_collide a; 
    struct collide b; 
    return 0; 
} 

처럼, 구조체의 이름을 다시 정의하는 매크로를 사용하는 것이 가능할 것 누군가가 불가피 아마도

// wrap_a.h 
#define collide a_collide 
#include "a.h" 
#undef collide 

같은 래퍼 헤더에 잘못된 구조체를 사용하여 오류 코드 전반에 걸쳐 무작위 교체를하지 않도록 매크로를 undef를해야합니다.

+0

나는 그렇게 끔찍한 해킹을 말하지 않을 것이다. 일단 프로그램에 두 개의 lex-generated scaners를 포함시켜야하고 많은 수의 심볼에 충돌이 발생했기 때문에 비슷한 트릭을 사용하여 매력처럼 작동했습니다. – qrdl

+0

당신이 걱정해야 할 것은 아마도이 충돌하는 이름이 외부 소스에서 왔기 때문에 구조체의 이름을 바꾸면 혼란 스러울 것이라고 생각합니다. 함수 호출 등에 대한 문서는 더 이상 실제 프로토 타입과 일치하지 않으므로 어떤 사용자가 어떤 일이 발생했는지에 대해 명확해야합니다. –

1

정말 좋은 아이디어가 떠오르지 않습니다. 다음은이 그리 좋은 사람은 : 당신은 매우 운이 좋은 경우에

  • , 당신은 코드 수 있도록 각이 한 번에 구조의 두 가지 유형에 액세스 할 필요가없는 모듈, 다음 단지를 포함하지 분리 할 수 ​​있습니다 적당한 우두머리와 당신은 떠난다. 이것은 위험으로 가득차 있으며 입니다. 유지 보수의 악몽이 될 것입니다. 당신을 후원하는 사람은 당신의 이름과 모든 자손을 일곱 번째 세대까지 저주하게 만들 것입니다.

  • 코드가 c89ish 인 경우 C++ 컴파일러로 컴파일하고 하나 이상의 잘못된 구조를 네임 스페이스에 래핑 할 수 있습니다. 이는 두 언어의 까다로운 모든 차이점 (캐스팅 규칙, 예약어로 class 등)에서 문제를 일으키므로 코드를 변경하지 말라는 요청을 거의 확실히 위반합니다.

행운을 빕니다.

관련 문제