내 코드베이스에서 두 모듈의 이름이 동일한 구조가 있음을 발견했습니다. 이름 충돌 오류가 발생했습니다. 코드를 변경하지 않고 해결할 수 있습니까?같은 이름의 두 구조를 해결하는 방법은 무엇입니까?
답변
이 끔찍한 해킹,하지만 당신은 아마 모두 헤더가 제공하는 구조체의 이름을 변경하려는 것 때문에
// 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를해야합니다.
나는 그렇게 끔찍한 해킹을 말하지 않을 것이다. 일단 프로그램에 두 개의 lex-generated scaners를 포함시켜야하고 많은 수의 심볼에 충돌이 발생했기 때문에 비슷한 트릭을 사용하여 매력처럼 작동했습니다. – qrdl
당신이 걱정해야 할 것은 아마도이 충돌하는 이름이 외부 소스에서 왔기 때문에 구조체의 이름을 바꾸면 혼란 스러울 것이라고 생각합니다. 함수 호출 등에 대한 문서는 더 이상 실제 프로토 타입과 일치하지 않으므로 어떤 사용자가 어떤 일이 발생했는지에 대해 명확해야합니다. –
정말 좋은 아이디어가 떠오르지 않습니다. 다음은이 그리 좋은 사람은 : 당신은 매우 운이 좋은 경우에
, 당신은 이 코드 수 있도록 각이 한 번에 구조의 두 가지 유형에 액세스 할 필요가없는 모듈, 다음 단지를 포함하지 분리 할 수 있습니다 적당한 우두머리와 당신은 떠난다. 이것은 위험으로 가득차 있으며 은입니다. 유지 보수의 악몽이 될 것입니다. 당신을 후원하는 사람은 당신의 이름과 모든 자손을 일곱 번째 세대까지 저주하게 만들 것입니다.
코드가 c89ish 인 경우 C++ 컴파일러로 컴파일하고 하나 이상의 잘못된 구조를 네임 스페이스에 래핑 할 수 있습니다. 이는 두 언어의 까다로운 모든 차이점 (캐스팅 규칙, 예약어로
class
등)에서 문제를 일으키므로 코드를 변경하지 말라는 요청을 거의 확실히 위반합니다.
행운을 빕니다.
- 1. 애매한 이름의 확장 방법을 해결하는 방법은 무엇입니까?
- 2. 다른 패키지에서 같은 이름의 두 클래스를 사용하는 방법은 무엇입니까?
- 3. 같은 이름의 다른 어셈블리를 참조하는 방법은 무엇입니까?
- 4. RUBYLIB가 가리키는 같은 이름의 파일 두 개가 있습니까?
- 5. PHP에서 두 파일 구조를 비교하는 방법은 무엇입니까?
- 6. 두 어셈블리에서 같은 이름의 클래스 (의도적으로)
- 7. 두 폴더의 내용을 비교하고 두 폴더에있는 같은 이름의 파일을 제거하십시오.
- 8. 페이지에 같은 이름의 입력란을 여러 개 가져 오는 방법은 무엇입니까?
- 9. Automake와 같은 이름의 파일들
- 10. Java에서 트리 계층 구조를 표시하는 방법은 무엇입니까?
- 11. 같은 이름의 PHP 파일이있는 경우 다시 쓰는 방법은 무엇입니까?
- 12. MYSQL 결과의 변수를 같은 이름의 PHP 변수로 변환하는 방법은 무엇입니까?
- 13. 같은 이름의 모든 확인란을 자동으로 선택하는 방법은 무엇입니까?
- 14. VHDL에서 스택/큐와 같은 데이터 구조를 구현하는 방법은 무엇입니까?
- 15. 방향 문제를 해결하는 방법은 무엇입니까?
- 16. 그래프 구조를 직렬화하는 방법은 무엇입니까?
- 17. 같은 열 이름의 두 가지 mySQL 쿼리에 참여하여 데이터를 표시하는 방법은 무엇입니까?
- 18. 동일한 파일을 두 번 요구해야합니까?이 문제를 해결하는 방법은 무엇입니까?
- 19. window.beforeunload가 Firefox에서 두 번 호출되었습니다.이 문제를 해결하는 방법은 무엇입니까?
- 20. 두 가지 MS SQL 데이터베이스의 구조를 비교하는 방법은 무엇입니까?
- 21. Xcode에서 같은 이름의 리소스 사용
- 22. IE7에 같은 이름의 쿠키가 두 개있을 때 어떻게해야합니까?
- 23. 다른 .js 파일에 같은 이름의 두 메서드를 사용하십시오.
- 24. a에 같은 이름의 두 개의 네임 스페이스를 포함하는 방법?
- 25. 한 페이지에 두 가지 형태가 같은 이름의 필드가있을 때 장고
- 26. as3에서 같은 이름의 두 가져 오기를 구별하려면 어떻게합니까?
- 27. 다른 MVC 모델에서 같은 이름의 두 테이블에 문제가 있습니까?
- 28. 나는 다음과 같은 구조를 가진 두 개의 테이블이 여러 OR의
- 29. C++ - 클래스와 같은 이름의 클래스에서 함수 호출하기
- 30. GCC에 파일 이름 충돌 문제를 해결하는 방법은 무엇입니까?
코드를 변경하는 것이 잘못된 이유는 무엇입니까? –
내가 가질 수 있다면, 나는 가질 것입니다. :) 죄송합니다 닐, 제 경우에는 옵션이 아닙니다. 나는 두 개의 다른 모듈을 통합하려고하는데, 둘 다 내 통제에서 벗어나서 그것들을 일으키고있다. – Jay