C++ 소스를 C로 바꾸는 작업

avatar80의 이미지

을 진행하려고 합니다. 덩치가 크고 간편한 소스를 C로 바꾸는 것이기에
어려움이 많다고 들었습니다.
이런 작업을 진행할때 큰 원칙은 어떤것들이 있습니까?
조언 부탁드립니다.

saxboy의 이미지

제 경우는 gtk 스타일의 C++ like C 를 굉장히 좋아하는 편인데요. 아마 gtk 위짓들을 어떤 식으로 작성하는지 한번 찾아보시면 도움이 되리라 생각합니다.
하지만 template + STL로 된 C++코드라면 어쩐지 처음부터 새로 짜는 것이 낫겠다는 생각이 드는데요. 이 녀석들을 void * 로 바꾸어서 작업하시려면 웬만한 기본적인 data structure 들... ( list, variable array, associative array, tree, ... ) ... 을 거의 다 작성해주셔야 할겁니다.

여튼... 제가 즐겨쓰는 방식을 간단히 적어보지요. 헤더만 적으면 되겠지요?

typedef struct __MYCLASS {
    int attr1; 
} _MYCLASS; 
typedef struct __MYCLASS  *MYCLASS; 

/* allocator & deallocator */
MYCLASS myclass_New(void); 
int myclass_Delete(MYCLASS c); 

/* copy constructor */
MYCLASS myclass_Copy(MYCLASS c); 

/* initializer & finalizer */
int myclass_Initialize(MYCLASS c); 
int myclass_Finalize(MYCLASS c); 

/* attibutes */
int myclass_SetAttr1(MYCLASS, int value); 
int myclass_GetAttr1(MYCLASS, int value2); 

/* member functions */
int myclass_MemberFunc(MYCLASS c, int arg1); 

뭐 대충 이런 식이됩니다. GTK코드에서 상속따위를 없애버린 제 스타일입니다 :shock:

C++에는 있지만 C에는 존재하지 않는 constructor와 destructor, copy constructor, reference 등을 잘 옮겨 주시는 것이 중요하지 않을까 싶은데요... 아울러 static 을 잘 활용하시면 private function 을 옮기는데도 많은 도움이 됩니다.

derived class따위가 있다면 좀 골치아프겠지요. 이때에는 composition 을 잘 사용하시면 좀 귀찮기는 하지만 그럭저럭 옮기실 수 있을것 같습니다.

이한길의 이미지

전 직접 해보지는 않았지만.. 둘다 프로그래밍을 조금은 해봤기 때문에...
제 생각에는 이렇게 하는것이 좋을 듯합니다.

일단 C++에서 클래스는 C의 구조체를 확장한 것이라고 볼 수 있습니다.
따라서 C++의 클래스의 필드들을 C의 구조체로 옮기고..
C에서 그 구조체를 받아서 처리하는 함수들을 만들면 되겠지요..
이를테면..

typedef struct
{
char *string;
}String;

void String_new ( char *string )
{
...
}

char *String_get ( String *s)
{
return s->string;
}

아주 극단적으로 단순한 예였습니다.

이런 식으로 바꾸시면 될거라 생각되네요.

----
먼저 알게 된 것을 알려주는 것은 즐거운 일이다!
http://hangulee.springnote.com
http://hangulee.egloos.com

avatar80의 이미지

ip받아서 처리하는 모듈인데 os따라서 틀리는 바람에
거의 새로 작성하는 꼴이 되어버렸네요.
그치만 이런류의작업들이 별로 많진 않나 부네요..
둘러봐도 컨버젼 관련된 내용은 잘 없네요.
특히 template같은 경우는 어떤 방법이 효율적인지 난해하군요..
하나하나 찾아서 만들수도 없고..--;;

^^ 함께 커가는 세상

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.