C++ 멤버 함수로 링크해야하는 모든 기능을 가진 .obj가 있습니다. 문제는 C 언어이기 때문에 클래스를 사용하는 클래스는 정상적인 이름보다 더 끔찍한 것을 기대합니다. 그래서 이것은 두 가지 방법으로 만 수행 할 수 있습니다 : C 함수의 이름을 변경하거나 어쨌든 맹 글링 된 이름을 가진 기호 테이블에 추가 기호를 추가하십시오. 그러나 여전히 원래 이름을 사용할 수 있습니다. 근본적으로 그 이름을 망가 뜨린다. 어떤 아이디어가 이것을 어떻게하는지 또는 이것을 완전히 다른 방법으로 해결할 수 있습니까? 공유하십시오. 그러나이 특별한 경우에는 extern "C"라고 말하는 것이 유용 할 것입니다.)) thx컴파일러에서 C 이름을 C++ 이름으로 변경하는 방법
-1
A
답변
7
(C 기반) 오브젝트 파일에는 심볼이 있으며 그 심볼을 다른 이름으로 다시 정의 할 수 없습니다. 해당 오브젝트 파일을 생성하는 컴파일러의 작업이되어야합니다. C 컴파일러는 C++에 대해 알지 못하므로 C++ 링키지 및 이름 맹 글링으로 심볼을 생성 할 수 없습니다. 따라서 해당 기호 (C 함수)를 사용하는 유일한 방법은 알고있는 기호로 기호를 호출하는 것입니다.
당신은 물론, (멤버) 함수와 같이 (간접의 추가 레벨이 떨어져 전화가 inline
입니다 경우 을 최적화) ++는 C를 구현 해당 기능을 사용할 수 있습니다
extern "C" { int my_C_func(void*, int); } // could be in an included header
struct A {
// implement the followind member using the C function
int operator()(int i) { return my_C_func(this,i); }
};
C++ 클래스가 이미 선언되었고 해당 선언에 손댈 수없는 경우에도 별도의 소스 파일에서 동일한 방식으로 멤버 함수를 구현할 수 있습니다. 그러나,이 inline
수 없으며, 따라서 추가 함수 호출의 비용에 온다 : 나에게 회신에서
in file.cpp:
extern "C" { int my_C_func(void*, int); } // could be in an included header
int A::operator()(int i) { return my_C_func(this,i); }
난 당신이 실제로 C 함수의 구현을 제어 할 수 있다는 결론 주석 처리합니다. 그래서 왜 이것을 C에서 구현해야합니까? C++로 간단히 구현할 수없는 이유는 무엇입니까? 그런 다음 올바른 링키지 및 이름 맹글 링을 가져오고 원하는 멤버 함수를 직접 구현할 수 있습니다.
관련 문제
- 1. C#에서 XElement 이름을 변경하는 방법
- 2. 컴파일러에서 C++ 프로그램 작동 방법
- 3. C# 코드를 사용하여 C# 프로젝트의 클래스 이름을 변경하는 방법
- 4. C++ 컴파일러에서 기본 복사 생성자를 합성하는 방법
- 5. C 컴파일러에서 오류가 있지만 C++ 컴파일러에서 오류가 발생했습니다.
- 6. 이전 C++ 컴파일러에서 펜싱
- 7. API로 Revit 2014 요소 이름을 변경하는 방법 C#
- 8. VBA에서 열 이름을 변경하는 방법
- 9. C++ 컴파일러에서 const 배열을 처리하는 방법
- 10. 다른 C++ 컴파일러에서 Visual C++ 사용?
- 11. C/C++ 컴파일러에서 메모리 누수 감지
- 12. 컴파일러에서 후크/메서드의 출력에 후크 (C# - C++)
- 13. 컨트롤의 이름을 변경하는 방법?
- 14. tabcontrol의 이름을 변경하는 방법
- 15. 이름을 자동으로 이름으로 바꿉니다.
- 16. 문자열을 파일 이름으로 C#
- 17. 변수 이름을 변경하는 방법
- 18. C++ 컴파일러에서 어셈블리 언어 출력
- 19. 이 최적화는 C# 컴파일러에서 수행합니까?
- 20. C#에서 NetworkAdapter의 이름을 변경하는 방법은 무엇입니까?
- 21. C++ 컴파일러에서 읽을 수있는 오류 메시지 받기
- 22. 컴파일러에서 C++ 응용 프로그램으로 디렉토리 전달
- 23. C#에서 X509Certificate2를 생성하는 동안 발급자 이름을 변경하는 방법
- 24. C# regex를 사용하여 파일 및 디렉토리 이름을 변경하는 방법
- 25. Excel 스프레드 시트의 C#에서 시트 이름을 변경하는 방법
- 26. htaccess로 도메인 이름을 변경하는 방법
- 27. C++ 메소드 이름을 헤더의 클래스 이름으로 규정 할 수 있습니까?
- 28. C#으로 이름으로 변수를 얻기
- 29. VS2010가 - 공용 클래스 이름을 변경하는 경우에만 C#에서 빌드 솔루션
- 30. 컴파일러에서 OpenCL.lib의 맹 글링 된 이름을 원합니다.
C 함수 * 모든 것을 C++ 멤버 함수로 링크해야합니다. * ?? 실제로, * this * 포인터를 포함하여? 어떻게 그렇게 될수 있니? AFAIK C는 * this *에 대해 알지 못합니다. – Walter
첫 번째 매개 변수로 지정했기 때문에 – Pyjong
실제 질문을하지 않습니다. C++로 작성해야 할 이유가 있습니다. 보통'this'가 각 메소드의 첫 번째 인자로'void * '로 추가 될 때 C++ 클래스를 작성하여 c 인터페이스로 감싸줍니다. – SHR