2009-04-10 6 views
42

일부 C++ 코드가 있습니다. 코드에는 많은 클래스 정의, 멤버 함수, 생성자, 클래스에 대한 소멸자, 템플릿 클래스가 거의없고 C++ 물건이 많이 있습니다. 이제 소스를 일반 C 코드로 변환해야합니다. C++ 코드를 C로 변환하는 방법

I

가 다음과 같은 질문 :

  1. C 코드를 C++ 코드와 헤더 파일을 변환 할 수있는 도구가 있습니까?

  2. 나는 코드의 전체 재 작성해야 할 것이다 (필자는 생성자, 소멸자를 제거하고 일부 init(), deinit() 기능에 해당 코드를 이동해야 할 것이다 변화 클래스를 구조, 그 함수 포인터로 기존 멤버 함수를 만들 새롭게 정의 된 구조체를 작성한 다음 함수 포인터 등을 사용하여 해당 함수를 호출합니다.

  3. 수동으로 직접 변환해야하는 경우 C++에서 C로 변환하는 동안주의해야 할 C++ 코드 데이터 구문/의미는 무엇입니까?

답변

29

실제로 Comeau의 C++ 컴파일러와 같은 도구가 있습니다. . 수동으로 유지할 수없는 C 코드가 생성되지만 문제는 없습니다. C++ 코드를 유지하고 C on the fly로 변환합니다.

+0

@MSalters : Comeaus 컴파일러에 대한 포인터 주셔서 감사합니다. 하지만 안타깝게도 저의 목적을 달성하지 못합니다. 보통 컴파일러 중간 형식 C 코드는 얻을 수 없으며, 일반 ANSI-C 컴파일러로는 컴파일 할 수없는 경우에도 얻을 수 있습니다. – goldenmean

+2

코드에서 예외 및 템플릿을 사용하지 않는 경우 코드에서 작동 할 수있는 cfront의 이전 복사본을 얻을 수 있습니다. 그러나 MSalters가 말하듯이 – lothar

+0

도 표준 라이브러리 기능을 사용하지 않아야합니다. –

6

C에서 OO를 수행 할 수 있지만 (예 : theType *this 첫 번째 매개 변수를 메소드에 추가하고 다형성을 위해 vtable과 같은 것을 수동으로 처리하는 등) 이는 결코 만족할만한 디자인이 아니며, 프로세서 해킹).

적어도 이것이 어떻게 작동하는지 비교하는 재 설계를 제안 할 것을 제안합니다.

전반적으로 많은 질문에 대한 답변에 달려 있습니다. C++ 코드를 사용한다면 왜 C를 대신 사용해야할까요?

+5

저자의 이유는 분명히 상황에 따라 다르지만 이유가 있습니다. 때로는 C++ 컴파일러가 특정 플랫폼에 존재하지 않거나 어떤 이유로 사용할 수 없을 수도 있습니다. 그것은 또한 매우 우수한 학습 도구로도 사용됩니다. – TechZilla

17

http://llvm.org/docs/FAQ.html#translatecxx

PS : 나는 그것을 전혀 사용하지 않았습니다. 작동하는지 알려주세요.

+0

@ plan9assembler : 포인터 주셔서 감사. 나는 그것을 확인하고 알게 될 것이다. – goldenmean

+1

LLVM을 사용하여 hello_world.cpp 파일을 C 파일로 변환하려고 시도했습니다. 그 결과 생성 된 C 코드는 기계어 코드만큼이나 추악합니다. 전 처리기의 include가 모두 사라졌습니다. – MikimotoH

+1

@MikimotoH, 구문 소스 변환 구문이 아니기 때문에 그런 식으로 보입니다. 이 컴파일러는 실제로 c로 출력 할 수있는 컴파일러이며, 이는 여전히 연결된 C++ 라이브러리에 의존한다는 것을 의미합니다. 디버깅이나 자료를 보는 데 정말 좋습니다. BTW : 추악 할 지 모르지만 기계 코드보다 나을 것 같아서 적어도 배울 수는 있습니다. 어떤 분해보다 clang C++에서 c로 더 잘 배울 수 있습니다. – TechZilla

5

아마도 'ol'cfront이 좋을까요?

+3

내가 아는 한, cfront는 오랫동안 유지되지 않았으며 현대 C++ 코드를 처리하지는 않습니다. –

4

컴파일러는 '프런트 엔드'와 '백 엔드'의 두 가지 주요 블록으로 구성됩니다. 컴파일러의 프런트 엔드는 소스 코드를 분석하고 소스 코드보다 기계 알고리즘에 의해 분석하기가 훨씬 쉬운 상기 소스 코드의 '중간 표현'을 구축합니다 (예 : C++의 소스 코드가 설계된 반면 인간 프로그래머이 코드를 작성하는 것을 돕기 위해 중개 양식은 알고리즘을 단순화하는 데 도움이되도록 설계되었습니다. 컴파일러의 백 엔드는 중간 양식을 가져 와서 '대상 언어'로 변환합니다.

이제 범용 컴파일러의 대상 언어는 다양한 프로세서 용 어셈블러 언어이지만 컴파일러 백 엔드가 다른 언어로 코드를 생성하는 것을 막을 수있는 방법은 없습니다. 대상 언어가 (적어도) 일반적인 CPU 어셈블러만큼 유연합니다.

C가 C++에서 C 컴파일러가 기술적 인 pov로 구현하는 데 아무런 문제가 없도록 C는 확실히 CPU의 어셈블러만큼 융통성이 있다고 상상해보십시오.

그래서 당신은 : C++를 --- 프론트 엔드 ---> someIntermediaryForm --- 백엔드 ---> C

당신은이 사람들을 체크 아웃 할 수 있습니다 : http://www.edg.com/index.php?location=c_frontend은 (위의 링크는 단지 정보입니다 무엇 GNU에 의해 C 컴파일러에는 같은 C++에서이없는, 그들의 앞은 내가 아는 한 수십

PS ) 수천 달러에 대한 종료 라이센스, 수행 할 수 있습니다, 이것은 완전히 경우 (저를 친다 나는 이것에 대해 옳다). C 언어는 상당히 작고 내부 메커니즘이 매우 초보적이기 때문에 C 컴파일러는 1 년 동안의 일과 같은 것을 필요로합니다. (필자가 직접 이런 컴파일러를 몇 년 전에 작성했기 때문에 내가 말할 수 있고, 가상 머신] 중개자 코드)를 가지고 있고 유지 보수 된 최신 C++ 컴파일러를 가질 수 있다면 C 컴파일러를 작성하는 것은 좋은 일이 될 것입니다 ...

+0

범용 컴파일러의 대상 언어는 다양한 프로세서 용 어셈블러 언어 (또는 컴퓨터 코드 ??)입니다 – qPCR4vir

2

이것은 오래되었습니다 스레드에 있지만 C++ Faq에는 section이 있습니다. 저자가 연락을하면 분명히 업데이트 될 것이고 결국 장기적으로 업데이트 될 것입니다.

관련 문제