C++ 코드를 C로 변환하는 방법
C++ 코드가 있어요.코드에는 많은 클래스가 정의되어 있으며, 멤버 함수, 컨스트럭터, 디스트럭터, 템플릿클래스가 거의 없고, C++가 많이 있습니다.이제 소스를 플레인 C 코드로 변환해야 합니다.
에는 다음과 같은 질문이 있습니다.
C++ 코드와 헤더 파일을 C 코드로 변환할 수 있는 툴이 있나요?
코드를 완전히 다시 작성해야 합니까? (컨스트럭터, 디스트럭터를 삭제하고 코드를 다른 곳으로 이동해야 합니다.)
init()
,deinit()
함수; 클래스를 구조로 변경하고, 기존 멤버 함수를 새로 정의된 구조에서 함수 포인터로 만든 다음 함수 포인터 등을 사용하여 함수를 호출할 수 있습니까?직접 변환해야 할 경우 C++에서 C로 변환할 때 C++ 고유의 코드 데이터 구성/의미에는 어떤 점에 유의해야 합니까?
http://llvm.org/docs/FAQ.html#translatecxx
일부 코드를 처리하지만 일부 최신 C++ 규약에서는 완전히 업데이트되지 않았기 때문에 더 복잡한 구현에서는 실패합니다.따라서 무엇이 허용되는지 알 수 있을 때까지 코드를 자주 컴파일해 보십시오.
버전 9.0.1의 명령줄 사용 현황 systax는 다음과 같습니다.
clang -c CPPtoC.cpp -o CPPtoC.bc -emit-llvm
clang -march=c CPPtoC.bc -o CPPtoC.c
이전 버전(이행 버전 불명)의 경우 다음 구문을 사용합니다.
llvm-g++ -c CPPtoC.cpp -o CPPtoC.bc -emit-llvm
llc -march=c CPPtoC.bc -o CPPtoC.c
실제 ANSI C가 아닌 C의 GNU 플레이버가 생성됩니다.코드에 너무 많은 투자를 하기 전에 이것이 도움이 되는지 테스트해 보는 것이 좋습니다.예를 들어 일부 임베디드 시스템은 ANSI C만 허용합니다.
또, 기능하고 있습니다만, 판독할 수 없는 코드가 생성됩니다.C++ 코드를 코멘트하고 유지하며, 최종 C 코드는 걱정하지 않는 것이 좋습니다.
EDIT : 이 기능의 공식 지원은 삭제되었지만 사용자는 Julia 언어 개발자의 비공식 지원을 사용하여 위의 기능을 실현할 수 있습니다.
아마 좋은 cfront가 괜찮을까?
컴파일러는 '프런트 엔드'와 '백 엔드'의 두 가지 주요 블록으로 구성됩니다.컴파일러의 프런트 엔드는 소스 코드를 분석하여 해당 소스 코드의 '중간 표현'의 어떤 형태를 구축합니다.이것은 소스 코드보다 머신 알고리즘에 의해 분석하기가 훨씬 쉽습니다(즉, 소스 코드와 같은 경우).C++는 인간 프로그래머가 코드를 작성할 수 있도록 설계되어 있으며, 중간 형식은 해당 중간 형식을 보다 쉽게 분석하는 알고리즘을 단순화할 수 있도록 설계되어 있습니다).컴파일러의 백엔드는 중간 형식을 취하여 '타깃 언어'로 변환합니다.
범용 컴파일러의 타깃 언어는 다양한 프로세서의 어셈블러 언어이지만, 해당 타깃 언어가 (적어도) 일반 CPU 어셈블러만큼 유연하다면 컴파일러 백엔드가 다른 언어로 코드를 생성하는 것을 막을 수 없습니다.
C는 CPU 어셈블러만큼 유연하기 때문에 C++-C 컴파일러는 기술적인 문제로부터 실장할 필요가 없습니다.
C++ ---frontEnd---> 일부Intermediary Form ---backEnd--->C
http://www.edg.com/index.php?location=c_frontend (위 링크는 실행 가능한 작업에 대한 정보일 뿐이며 프런트 엔드의 라이선스는 수만 달러에 달합니다)를 참조해 주십시오.
PS GNU에 의한 C++-C 컴파일러는 제가 아는 한 없습니다.이것이 완전히 제 의견입니다(제가 맞다면).C언어는 매우 작고 내부 메커니즘은 매우 기초적이기 때문에 C컴파일러는 1년간 작업해야 합니다(몇 년 전에 컴파일러를 직접 작성했기 때문에 직접 말씀드릴 수 있습니다).또한 최신 C++ 컴파일러를 유지할 수 있습니다.C 컴파일러를 한 번만 쓰면 되는데...
이것은 오래된 실이지만 보아하니C++ Faq
에는 이에 대한 섹션(아카이브 2013 버전)이 있습니다.작성자에게 연락을 취하면 이 내용이 갱신되어 장기적으로는 보다 최신이 될 것으로 생각되지만, 최신 버전은 다음과 같습니다.
무슨 뜻인지에 따라 다르죠즉, C++를 읽기 쉽고 유지보수가 가능한 C-code로 변환할 수 있습니까?죄송합니다. 정답은 "아니오"입니다.C++ 기능은 C에 직접 매핑되지 않습니다.또, 생성된 C 코드는, 인간이 따를 수 있는 것이 아닙니다.C++ 컴파일러가 없는 플랫폼에 컴파일하기 위해 C++를 C로 변환하는 컴파일러가 있습니까?운이 좋으시네요. 계속 읽어보세요.
C++를 C로 컴파일하는 컴파일러는 프로그램에서 완전한 구문 및 의미 검사를 수행하며, 객체 코드를 생성하는 방법으로 C 코드를 사용합니다.이러한 컴파일러는 단순히 고급 매크로 프로세서가 아닙니다.(그리고 이것들이 프리프로세서라고 주장하는 이메일은 보내지 말아주세요.그것들은 완전한 컴파일러가 아닙니다.)ISO Standard C++의 모든 기능을 C로 변환하여 구현할 수 있으며 예외 처리를 제외하고 일반적으로 기존 C++ 컴파일러에 의해 생성된 코드와 동등한 효율성을 가진 객체 코드가 생성됩니다.
C로의 컴파일을 실행하는 제품은 다음과 같습니다.
- Comeau Computing은 에디슨 디자인 그룹의 프런트 엔드를 기반으로 C 코드를 출력하는 컴파일러를 제공합니다.
- LLVM은 C 코드를 방출하는 다운로드 가능한 컴파일러입니다.여기와 여기도 참조해 주세요.다음으로 LLVM을 통한 C++에서 C로의 변환 예를 나타냅니다.
Cfront는 AT&T에서 Bjarne Stroustrup 등이 C++를 구현하여 C코드를 생성합니다.그러나 두 가지 문제가 있습니다.90년대 중반부터 라이선스를 취득하는 것이 어려웠고 동시에 개발이 중단되어 버그를 수정하지 못하고 새로운 언어 기능(예: 예외, 네임스페이스, RTI, 멤버 템플릿)을 지원하지 않습니다.
일반적인 속설과는 달리, 이 글에서는 C++를 C로 번역하는 g++ 버전은 없습니다.그런 일은 할 수 있을 것 같지만, 실제로 해 본 사람이 있는지 모르겠다.
생성된 C 코드가 이 플랫폼 전용이 되도록 타깃 플랫폼의 CPU, OS 및 C 컴파일러를 지정해야 합니다.즉, (a)플랫폼 X용으로 생성된 C코드를 플랫폼 Y에서 컴파일할 수 없습니다.또 (b)번역을 직접 하는 것은 어렵습니다.이러한 툴 중 하나를 사용하면 훨씬 저렴하고 안전할 수 있습니다.
다시 한 번 말씀드리겠습니다.이것들은 프리프로세서일 뿐이며 컴파일러일 뿐이라는 메일은 보내지 말아 주세요.
실제로 Comau의 C++ 컴파일러라는 툴이 있습니다.수동으로 관리할 수 없는 C코드가 생성되지만 문제 없습니다.C++ 코드를 유지하고 바로 C로 변환합니다.
C에서 OO를 할 수 있는 반면 (예를 들어 a를 추가하여)theType *this
메서드에 대한 첫 번째 매개 변수와 다형성을 위한 vtable과 같은 것을 수동으로 처리) 이것은 디자인으로서 결코 특별히 만족스럽지 않으며 (일부 사전 해킹을 사용하더라도) 보기 흉할 것입니다.
저는 적어도 어떻게 될지 비교하기 위해 재설계하는 것을 추천합니다.
대체로 중요한 질문에 대한 답변에 따라 달라집니다.C++코드가 동작하고 있다면 왜 C를 원합니까?
언급URL : https://stackoverflow.com/questions/737257/how-to-convert-c-code-to-c
'programing' 카테고리의 다른 글
Vue-CLI 구성 요소 오류: 템플릿 컴파일러를 사용할 수 없는 Vue 런타임 전용 빌드를 사용하고 있습니다. (0) | 2022.06.11 |
---|---|
Android로 파일을 다운로드하고 진행 상황을 ProgressDialog로 표시 (0) | 2022.06.11 |
java equals() 메서드 덮어쓰기 - 작동하지 않음 (0) | 2022.06.11 |
문자열의 특정 인덱스에 있는 문자를 바꾸시겠습니까? (0) | 2022.06.11 |
한 번에 여러 개의 값을 구조체에 할당하는 방법 (0) | 2022.06.10 |