C에서 복잡한 프로젝트를 어떻게 구성해야합니까? [닫은]


79

저는 초급 수준의 C 기술 이상을 가지고 있으며 C로 다소 복잡한 응용 프로그램을 구성하기위한 사실상 "표준"이 있는지 알고 싶습니다. 심지어 GUI 기반 응용 프로그램도 있습니다.

저는 항상 Java와 PHP에서 OO 패러다임을 사용해 왔으며 이제 C를 배우고 싶기 때문에 응용 프로그램을 잘못된 방식으로 구성 할 수 있습니다. 절차 적 언어로 모듈화, 분리 및 건조 함을 갖기 위해 따라야 할 지침이 무엇인지 놓치고 있습니다.

제안 할 판독 값이 있습니까? C 용 애플리케이션 프레임 워크를 찾을 수 없었습니다. 프레임 워크를 사용하지 않더라도 항상 코드를 검색하여 좋은 아이디어를 찾았습니다.


3
Unix 철학은 대규모 프로젝트를 구성하는 데 매우 유용합니다. http://www.faqs.org/docs/artu/ch01s06.html
newDelete

답변:


51

핵심은 모듈화입니다. 이것은 설계, 구현, 컴파일 및 유지 관리가 더 쉽습니다.

  • OO 앱의 클래스와 같이 앱의 모듈을 식별합니다.
  • 각 모듈에 대한 별도의 인터페이스 및 구현, 다른 모듈에 필요한 것만 인터페이스에 넣습니다. C에는 네임 스페이스가 없으므로 인터페이스의 모든 것을 고유하게 만들어야합니다 (예 : 접두사 사용).
  • 구현시 전역 변수를 숨기고 읽기 / 쓰기에 접근 자 함수를 사용합니다.
  • 상속 측면에서 생각하지 말고 구성 측면에서 생각하십시오. 일반적으로 C에서 C ++를 모방하려고하지 마십시오. 이것은 읽고 유지하기가 매우 어렵습니다.

학습 할 시간이 있다면 필수 package(모듈 인터페이스) 및 package body(모듈 구현) 과 함께 Ada 앱의 구조를 살펴보십시오 .

이것은 코딩을위한 것입니다.

유지 관리를 위해 (한 번 코딩하지만 여러 번 유지하는 것을 기억하십시오) 코드를 문서화하는 것이 좋습니다. Doxygen 은 저에게 좋은 선택입니다. 또한 리팩터링 할 수있는 강력한 회귀 테스트 스위트를 구축하는 것이 좋습니다.


30

OO 기술이 C에 적용될 수 없다는 것은 일반적인 오해입니다. 대부분은 할 수 있습니다. 단지 작업 전용 구문을 사용하는 언어보다 약간 더 다루기 힘들다는 것입니다.

강력한 시스템 설계의 기초 중 하나는 인터페이스 뒤에 구현을 캡슐화하는 것입니다. FILE*그리고 (직장하는 기능 fopen(), fread()등) 캡슐화 인터페이스를 설정 C에 적용 할 수있는 방법의 좋은 예이다. (물론 C에는 액세스 지정자가 없기 때문에 아무도 내부를 들여다 볼 struct FILE수는 없지만 마조히스트 만 그렇게 할 수 있습니다.)

필요한 경우 함수 포인터 테이블을 사용하여 C에서 다형성 동작을 가질 수 있습니다. 예, 구문은 추악하지만 효과는 가상 함수와 동일합니다.


11
순수 C 코더는 ...이 코드를 읽고 길을 잃을 것
mouviciel

15
@mouviciel : 쓰레기! 대부분의 C 코더는 함수 포인터를 이해합니다 (또는 적어도 이해해야합니다). 여기서 그 이상으로 진행되는 일은 없습니다. 적어도 Windows에서는 장치 드라이버와 COM 개체가 모두 이러한 방식으로 기능을 제공합니다.
j_random_hacker

8
내 요점은 무능함이 아니라 불필요한 합병증에 관한 것입니다. 함수 포인터는 C 코더 (예 : 콜백)에서 일반적이지만 상속은 그렇지 않습니다. C로 코딩하는 C ++ 코더가 의사 C ++ 클래스를 빌드하는 것보다 C를 배우는 데 시간을 사용하는 것이 좋습니다. 즉, 어떤 경우에는 귀하의 접근 방식이 유용 할 수 있습니다.
mouviciel

3
실제로 C ++ pimpl 관용구를 사용하여 액세스 지정자를 시뮬레이션 할 수도 있습니다 . 유형 의 private 멤버가 구현에서만 볼 수있는 유형 ( ".c 파일"이라고도 함)으로 캡슐화되면 인터페이스 사용자는이를 변경하는 데 어려움을 겪을 것입니다 (물론 쓰레기를 pimpl 포인터, 그들이 의도적으로 당신을 망치고 싶다면 C ++에서 똑같이 할 수 있습니다).
비트 마스크

2
Downvoter : 댓글을 달고 싶으신가요?
j_random_hacker

15

모든 좋은 대답.

"데이터 구조 최소화"만 추가합니다. 이것은 C에서 더 쉬울 수 있습니다. 왜냐하면 C ++가 "C with classes"라면 OOP는 여러분이 머릿속에있는 모든 명사 / 동사를 가져 와서 클래스 / 메소드로 바꾸도록 장려하기 때문입니다. 그것은 매우 낭비적일 수 있습니다.

예를 들어, 특정 시점의 온도 판독 값 배열이 있고 Windows에서이를 선 차트로 표시하려고한다고 가정합니다. Windows에는 PAINT 메시지가 있으며이 메시지를 받으면 LineTo 함수를 수행하는 배열을 반복하여 데이터를 픽셀 좌표로 변환 할 때 크기를 조정할 수 있습니다.

내가 완전히 너무 많이 본 것은 차트가 점과 선으로 구성되어 있기 때문에 사람들은 각각 DrawMyself가 가능한 점 개체와 선 개체로 구성된 데이터 구조를 구축하고 그 이론에 따라 지속적으로 만들 것입니다. 어떤 식 으로든 "더 효율적"이거나 차트의 일부 위에 마우스를 올려 데이터를 숫자로 표시 할 수 있어야하므로 개체에 메서드를 구축하여이를 처리 할 수 ​​있습니다. 더 많은 개체를 만들고 삭제하는 작업이 포함됩니다.

그래서 당신은 너무나 읽기 쉬운 엄청난 양의 코드를 얻게되며 단지 90 %의 시간을 객체 관리에 소비하게됩니다.

이 모든 것은 "좋은 프로그래밍 관행"과 "효율성"이라는 이름으로 이루어집니다.

적어도 C에서는 간단하고 효율적인 방법이 더 분명 할 것이며 피라미드를 건설하려는 유혹은 덜 강할 것입니다.


1
당신의 대답을 사랑하십시오. 그것은 완전히 사실입니다. OOP는 죽어야합니다!
Jo So

@JoSo : OOP를 사용하지만 최소한.
Mike Dunlavey

나에게 "최소한"(그것이 당신에게 의미하는 바는 모르겠지만) 실제로 OOP로 계산되지는 않습니다. 이것은 기본적으로 객체 지향 프로그래밍입니다.
Jo So

"OOP"도 사용합니다. 주로 init () 및 exit () 루틴이있는 내 C 모듈 용입니다.
Jo So

11

GNU 코딩 표준은 수십 년에 걸쳐 진화했다. 편지를 따르지 않더라도 읽어 보는 것이 좋습니다. 여기에서 제기 된 요점에 대해 생각하면 자신의 코드를 구성하는 방법에 대한 확고한 기반을 얻을 수 있습니다.


4
모두가 좋아하는 것은 아닙니다. lxr.linux.no/linux+v2.6.29/Documentation/CodingStyle : "먼저, GNU 코딩 표준의 사본을 인쇄하고 읽지 말 것을 제안합니다. 태워 버리십시오. 위대한 상징적 제스처 ". 나는 몇 년 동안 그것을 읽지 않았지만 Linus는 몇 가지 유효한 반대를 가지고 있습니다.
hlovdal 2009

1
@hlovdal : 물론 모든 사람이 특정 코딩 표준을 좋아하는 것은 아니기 때문에 유사한 사용 사례에 대한 표준이 둘 이상 있습니다. 중요한 부분은 실질적인 임시 불일치보다는 최소한 일부 표준을 따르는 자신의 프로젝트 내에서 일관성이 있다는 것입니다.
JM Becker

4

Java 또는 C ++로 코드를 구성하는 방법을 알고 있다면 C 코드에서도 동일한 원칙을 따를 수 있습니다. 유일한 차이점은 컴파일러가 없기 때문에 모든 것을 수동으로 신중하게 수행해야한다는 것입니다.

패키지와 클래스가 없기 때문에 먼저 모듈을 신중하게 디자인해야합니다. 가장 일반적인 방법은 각 모듈에 대해 별도의 소스 폴더를 만드는 것입니다. 서로 다른 모듈간에 코드를 구별하기 위해 명명 규칙에 의존해야합니다. 예를 들어 모든 함수 앞에 모듈 이름을 붙입니다.

C로 클래스를 가질 수 없지만 "추상 데이터 유형"을 쉽게 구현할 수 있습니다. 모든 추상 데이터 유형에 대해 .C 및 .H 파일을 만듭니다. 원하는 경우 두 개의 헤더 파일 (공용 및 개인용)을 가질 수 있습니다. 아이디어는 내 보내야하는 모든 구조, 상수 및 함수가 공용 헤더 파일로 이동한다는 것입니다.

도구도 매우 중요합니다. C를위한 유용한 도구는 lint 이며 코드에서 악취를 찾는 데 도움이 될 수 있습니다. 사용할 수있는 또 다른 도구는 문서 를 생성하는 데 도움이되는 Doxygen 입니다.


4

캡슐화는 개발 언어에 관계없이 항상 성공적인 개발의 핵심입니다.

C에서 "private"메서드를 캡슐화하는 데 사용한 트릭은 ".h"파일에 프로토 타입을 포함하지 않는 것입니다.


3

다음과 같은 인기있는 오픈 소스 C 프로젝트의 코드를 확인해 보라고 권합니다 ... 흠 ... Linux 커널 또는 Git; 어떻게 구성하는지 확인하세요.



2

첫 번째 단계로 C / C ++ 교과서를 읽는 것이 좋습니다. 예를 들어, C Primer Plus는 좋은 참조입니다. 예제를 살펴보면 Java OO를 C와 같은보다 절차적인 언어로 매핑하는 방법에 대한 아이디어를 얻을 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.