책 '쉽게 배우는 C 프로그래밍 테크닉' 에 나온 내용을 발췌하여 정리했다.

헤더파일(.h)

다음 내용이 포함된다.

  1. 외부에 공개하는 함수형 매크로의 정의
  2. 외부에 공개하는 상수의 정의(#define 또는 enum)
  3. 외부에 공개하는 구조체(struct)나 공용체(union)의 정의
  4. 외부에 공개하는 형식의 정의(typedef)
  5. 전역 함수의 원형 선언
  6. 전역 변수의 extern 선언

헤더 파일에는 함수의 원형 선언문이나 상수의 정의, typedef 정의 등을 기술한다. 여기서 주의할 점은, 다른 파일에서 참조할 필요가 있는 것만을 헤더 파일에 포함시켜야 한다는 점이다. 외부에서 참조할 일이 없는 선언이나 정의는 헤더 파일에 넣지 말고 .c 파일의 앞부분에 두도록 한다.
외부에 공개하는 함수는 .c 파일에 본문을 정의하고, 헤더 파일에서는 그 원형을 선언한다. 외부에서 이 함수를 사용하려면 헤더 파일을 인클루드한다. 또 .c 파일도 자신의 함수가 선언되어 있는 헤더 파일을 인클루드하도록 한다.

메인파일(.c)

다음 내용이 포함된다.

  1. 해당 파일에서만 쓰이는 선언이나 정의(매크로, 상수, 구조체, 공용체, 열거체(enumeration), typedef, 함수, 정적 전역 변수등의 정의)
  2. 함수 본문
  3. 전역 변수의 정의

.c 파일에는 함수와 변수의 정의, 그리고 파일 내에서만 쓰이고 공개할 필요가 없는 상수, 구조체, 형 등의 정의를 기술한다.
특히 .c 파일 내에서만 쓰이는 함수나 정적 전역 변수는 반드시 static 으로 정의한다. 이것은 다음 사항을 보장해준다.

  1. 외부 파일에서 이러한 함수와 변수에 대한 접근이 불가능해져 은폐성을 보장한다.
  2. 이 파일 내에서 지역적인 함수(또는 변수)로 간주되므로, 다른 파일에 같은 이름의 함수(또는 변수)가 존재하여 충돌이 발생할 우려를 제거해준다.

const 활용

원주율 등 변하지 않은 상수를 이용하는 경우 변수를 const 로 정의하면 그 값이 변하지 않는 것을 보장할 수 있다.
참고로 const 수식어를 지정하여 변수를 정의하는 경우, 컴파일러에 따라서는 이 변수를 쓰기 금지된(read-only) 메모리 영역에 배치하는 수도 있다. 그 덕분에 메모리 보호(memory protection)가 이루어지는 운영체제에서는 가령 “assignment of read-only location” 경고를 무시하고 억지로 대입문을 실행하여도, 실행시에 오류가 발생하는 수가 있다.

버그가 생기지 않는 코딩 습관

  1. 하나의 지역 변수를 여러 용도로 사용하지 말 것
  2. 함수의 인자를 다른 목적으로 이용하지 말 것
  3. malloc() 과 free()는 서로 가까이 둘 것
  4. 구조체는 생성과 동시에 초기화하라
  5. 서로 연관된 코드는 가까이 둘 것
  6. 포인터는 NULL 로 초기화하자
  7. 캐스팅을 자제할 것
  8. 충분히 캐스팅 할 것
  9. 일관성 있는 이름 붙이기
  10. sizeof(char)를 명시할 것
  11. 점검하기 쉬운 스타일을 취할 것
  12. 자신의 의도를 분명히 드러낼 것
  13. 충분히 생각한 후에 코딩하라

버그가 발생했을 때 대처하기 쉬운 코딩 스타일

  1. 반납한 포인터는 NULL 로 리셋하자
  2. 함수의 앞부분에서 인자를 검사할 것

추적을 위한 코딩 스타일

  1. 서로 연관된 것은 같은 디렉토리에 둘 것
  2. 함수를 여러 행에 걸쳐서 쓰지 말 것
  3. grep 으로 검색하는 경우에 대비할 것
  4. 자작 도구의 활용을 의식할 것

수정과 확인이 쉬운 코드

  1. 중괄호를 생략하지 말 것
  2. return 을 한 군데로 몰아둘 것
  3. 비슷한 코드는 한 곳에 합쳐둘 것
  4. 수정 후에는 곧바로 확인 할 것

장래성이 있는 코드

  1. 블록이 깊게 중첩되지 않도록 할 것
  2. goto 의 사용을 꺼리지 말 것

충분한 사유가 있어서 일정한 분량의 코드를 한꺼번에 뛰어넘는 goto 를 구사하는 것은 꺼릴 필요가 없다. 물론 if(){…} 같은 일반적인 기술 방식을 사용할 수 있는 경우에는 굳이 goto 를 사용할 필요가 없고, goto 를 사용하는 경우에는 코드의 위아래를 오가는 스파게티 프로그램이 되지 않도록 조심해서 사용해야 한다.

코딩 단계에서 신경 써야 할 사항

  1. 게을러 질 것
  2. 버릇들이기
    미심쩍은 구문은 쓰지 않도록 버릇을 들인다. 잘 생각해본 후에 코딩하는 버릇을 들인다. 나눗셈을 할 때에는 캐스팅을 하도록 버릇을 들인다

  1. 다른 사람을 배려하라
  2. 한 달 뒤의 자신은 곧 남이다.
  1. 규격이나 문법을 맹신하지 말 것

디버그 코드

  1. abort() 사용
    abort() 는 POSIX 에서 정의되어 있는 함수이다. abort() 를 호출하면 곧바로 프로그램이 강제 종료된다. 이때, 일반적인 UNIX 환경이라면 응용프로그램의 코어 덤프를 얻을 수 있으므로 디버기를 이용하여 어디서 어떤 식으로 실행이 중단되었는지를 추적할 수 있다.

  1. assert() 사용
  2. assert() 는 정수의 인자를 하나 받아서 그 내용이 거짓(즉 0)인 경우 assert() 에 걸린 조건식과 그 위치(파일이름과 행)를 표시하고 abort() 하는 매크로이다.
  1. syslog() 사용
  2. 디버깅 레벨

오류 처리

  1. 오류 처리는 함수 마지막에 모아둔다.
  2. 함수는 처리 결과의 성패 여부를 반환 값으로 돌려주도록 한다.
  3. 래퍼(wrapper) 함수

어떤 서비스 인터페이스 위에 한 겹의 인터페이스를 덧씌워서 서비스를 중계하는 껍데기를 래퍼라고 부른다. 원래 호출되어야 할 함수에 앞서 한 단계 별도의 함수를 두어 다른 작업(인자의 점검, 메시지 출력)을 처리한 후 본래의 함수를 호출하는 것이다.

실제 개발 사례

  1. 명세서 작성
    1. 기능 설계
    2. 기능 명세서 작성(라이브러리의 기능 및 역할, 기능을 이용하기 위한 인터페이스, 제공되는 함수, 구조체, 상수의 목록)
항목 내용
목적 개발 배경과 개요를 기술한다.
기능 주요 기능을 기술한다.
인터페이스 라이브러리의 기능을 이용하기 위한 인터페이스를 기술한다.
사용예 라이브러리를 이용한 예제를 소개한다. 사용자에게는 중요한 내용이다.
제공 방식 라이브러리가 제공되는 방식(소스공개, 목적파일만 공개 등)을 기술한다. Makefile 을 만들 때 필요하다.
제공 목록 라이브러리가 제공하는 함수, 구조체, 상수 등의 목록

  1. 명세서의 리뷰
  2. 코딩 : 상세설계, 코딩, 코드의 리뷰
  3. 테스트
  4. 시험 명세서 작성

항목 내용
실시 기간 테스트를 실시할 예정 시기
실시 방법 테스트 환경에 대해 쓴다. 테스트에 복잡한 구성이 필요한 경우에는 그림을 포함하여 상세하게 기술한다.
사용 장비 테스트에 필요한 기자재 일람. 특수한 장비가 필요한 경우, 이의 조달, 일정 조율 등에 관한 내용을 포함한다.
테스트 항목 실시할 테스트의 내용을 기술한다. 필요한 경우 사용 장비와 환경에 대해서도 언급한다.
테스트 결과 테스트 실시 결과를 기록한다. 장애가 발견된 경우 그 내용, 대책, 재 테스트 결과등을 기록한다.

  1. 통합 테스트, 릴리즈,유지보수, 완료

마치면서

프로그래밍은 프로그래머 본인의 지식과 기술이 크게 작용하는 작업이다. 기술자인 이상, 자신의 기술력을 항상 레벨업해나가지 않으면 안된다. 이를 위해 중요한 것은 다음과 같다.

  1. 다양한 기술을 알아둘 것
  2. 프로그래밍 이외의 세상에 대해 공부할 것
  3. 프리 소프트웨어를 만들어보고, 프로그래밍의 재미를 만끽할 것
  • computer/programming/c_프로그래밍_테크닉.txt
  • Last modified: 3 years ago
  • by likewind