2009-08-02 6 views
6

나는 객체 지향 코드 시대에 전문 프로그래머가되었고 수년간의 C++ 프로그래밍 경력을 가지고 있습니다. 나는 수년간의 레거시 코드를 가진 커다란 프로젝트를 C + +와 C의 혼합으로 작업합니다. 시스템의 순수한 부분에서 작업하는 것이 덜 편합니다. C++로 프로그래밍 할 때 모든 C 구문을 이해할 수 있지만, 객체가없는 복잡한 C 프로그램을 구성하는 방법에 대한 지식과 내가 채우기를 원하는 메모리를 관리하기위한 최적의 방법은 무엇인지 알 수 있습니다. 나는 자바 프로그래머로 일한 후에 C++을 배웠고, C++ 프로그래머와 C++ 프로그래머로 번역 된 자바를 조금 더 만들 것이라고 생각한다.실력있는 C++ 프로그래머가 C를 배우는 데 도움이되는 자습서가 있습니까?

+0

내가 자습서를 찾은 것은 c 프로그래머가 C++로 이동한다고 가정하는 것입니다. 분명히 C를 더 잘 이해하고자하는 유일한 객체 지향 프로그래머가 될 수는 없습니다. –

+0

문제가 발생하지 않게하는 방법을 가르쳐주는 중간 크기의 C 프로그램을 몇 개 작성하면 생각합니다. 실제로 어떤 언어로든 문제가 생기는 것은 배울 가치가있는 방법입니다. 뜨겁게 만지는 것. – Nosredna

+0

StackOverflow에는 이미이 질문에서 몇 가지 질문이 있습니다. 대부분 C++의 관점에서 기능하는 제 네이티브 C 스피커에서 보았을 때 좋았던 여러 가지 조언을 보았습니다. 그들은 사냥 가치가 있을지 모릅니다. – dmckee

답변

1

POSIX APIs보고 조직의 관점에서가, 특히 pthreads 당신에게 C 코드를 구성하는 방법에 대한 좋은 아이디어를 줄 것이다. 좋은 C 프로젝트 조직의 기본 규칙은 다음과 같습니다.

  • 구조물을 노출시키지 마십시오. 불투명 한 유형 만 사용하십시오.
  • 함수 이름의 접두사로 라이브러리 및 데이터 유형 이름을 사용하십시오.
  • 할당/구성 및 소멸/할당 해제를위한 "작성"및 "삭제"기능을 제공하십시오.
  • 해당 유형에서 작동하는 함수의 첫 번째 매개 변수로 은폐 데이터 형식을 전달하십시오.
  • C 또는 C++를 사용하여 C API를 구현합니다 (사용자의 책임). 분명히 거기에 불투명하지 않은 유형을 사용하십시오.
0

포인터를 광범위하게 사용하여 건물 프로그램을 살펴 본다. 어쨌든 낮은 수준의 구조체가 내 의견으로는 좋은 시작이 될 것입니다. 그것은 또한 프로그램이 무엇을 위해 만들어 졌는지에 달려 있습니다. 임베디드 rtos 보드 또는 마이크로 컨트롤러 시스템에 C 코드를 작성하려고합니까?

+0

저는 c가 많은 레거시 시스템에서 일하는 경우가 있습니다. 그래서 그것이 초기의 이유입니다. 또한 모든 것이 객체가되어야한다고 가정하기보다는 struct 및 다른 c 기술의 데이터를 기반으로 구축 된 프로그램을 설계하는 데 더 익숙해지는 것이 더 나은 C++ 프로그래머가 될 것이라고 생각합니다. –

+0

그럴 경우 Java에서 포인터를 처리 할 수 ​​없으므로 포인터 지식을 향상시킬 것을 적극 권장합니다. 하드웨어 최적화에 대해 배우고 싶다면 임베디드 싱글 보드 컴퓨터, 마이크로 컨트롤러 또는 스마트 폰/PDA를 사용하여 하드웨어에 최적화 된 C/C++ 작성 방법을 배우는 것이 좋습니다. – stanigator

1

나는 기본적으로 너와 같은 배가었지만 (경험이 적었지만 자바보다는 파이썬으로 시작했다.) 나에게 가장 잘 맞는 것은 Kernighan과 Ritchie를 읽고 앉아서였다. 구문에 익숙하기 때문에 책의 전반부는 건너 뛸 수 있지만 저수준 메모리 관리에 대해 더 잘 이해할 수 있습니다.

메모리 관리와 관련된 Linux 커널 소스 부분을 읽는 것도 도움이되지만 마음이 희미하거나 쉽게 지루할 수는 없습니다.

1

확장 another answer에, 한 가지 방법은 작성하는 것입니다 객체 지향 C.이 (예를 들어 그놈 스택이 주로 G 객체를 기반으로 거의 완전히 객체 지향 C, 대부분의 도서관은 내가 행동과 상호 작용하는 방법 라이브러리를 쉽게 만들 수 있습니다). 통사론적인 설탕없이 C++로 생각할 수 있습니다.

당신은 거의 정확하게


class Foo { 
    public: 
    Foo() { /* whatever */ } 

    int make_waffles (int no_of_guests) {} 
}; 

int main() { 
    Foo *my_foo = new Foo(); 
    my_foo->make_waffles (1); 
    delete my_foo; 
} 
+0

c 예제의 첫 번째 main() 행에 별표가 누락되었습니다. – quinmars

+0

사실입니다. 고마워, 나는 그것을 고쳤다. – RAOF

1

에 또한 커니 핸과 리치가 쓴 The C Programming Language ANSI C Edition을 확인할 수 있습니다 해당


/* in project NewStuff; namespace is ns */ 
ns_foo_t *ns_foo_new(); 
void ns_foo_delete (ns_foo_t *); 

int ns_foo_make_waffles (ns_foo_t *this, int no_of_guests); 

int main() { 
    ns_foo_t *my_foo = ns_foo_new(); 
    ns_foo_make_waffles (my_foo, 1); 
    ns_foo_delete (my_foo); 
} 

같은 API와 끝까지.예, 오래된 것입니다. 그러나 표준 라이브러리뿐만 아니라 전체 언어를 다루는 약 200 페이지의 시계 만 있습니다.

관련 문제