====== C 프로그래밍 테크닉 ====== 책 [[:book:388|쉽게 배우는 C 프로그래밍 테크닉]] 에 나온 내용을 발췌하여 정리했다. ====== 헤더파일(.h) ====== 다음 내용이 포함된다. - 외부에 공개하는 함수형 매크로의 정의 - 외부에 공개하는 상수의 정의(#define 또는 enum) - 외부에 공개하는 구조체(struct)나 공용체(union)의 정의 - 외부에 공개하는 형식의 정의(typedef) - 전역 함수의 원형 선언 - 전역 변수의 extern 선언 헤더 파일에는 함수의 원형 선언문이나 상수의 정의, typedef 정의 등을 기술한다. 여기서 주의할 점은, 다른 파일에서 참조할 필요가 있는 것만을 헤더 파일에 포함시켜야 한다는 점이다. 외부에서 참조할 일이 없는 선언이나 정의는 헤더 파일에 넣지 말고 .c 파일의 앞부분에 두도록 한다. 외부에 공개하는 함수는 .c 파일에 본문을 정의하고, 헤더 파일에서는 그 원형을 선언한다. 외부에서 이 함수를 사용하려면 헤더 파일을 인클루드한다. 또 .c 파일도 자신의 함수가 선언되어 있는 헤더 파일을 인클루드하도록 한다. ====== 메인파일(.c) ====== 다음 내용이 포함된다. - 해당 파일에서만 쓰이는 선언이나 정의(매크로, 상수, 구조체, 공용체, 열거체(enumeration), typedef, 함수, 정적 전역 변수등의 정의) - 함수 본문 - 전역 변수의 정의 .c 파일에는 함수와 변수의 정의, 그리고 파일 내에서만 쓰이고 공개할 필요가 없는 상수, 구조체, 형 등의 정의를 기술한다. 특히 .c 파일 내에서만 쓰이는 함수나 정적 전역 변수는 반드시 static 으로 정의한다. 이것은 다음 사항을 보장해준다. - 외부 파일에서 이러한 함수와 변수에 대한 접근이 불가능해져 은폐성을 보장한다. - 이 파일 내에서 지역적인 함수(또는 변수)로 간주되므로, 다른 파일에 같은 이름의 함수(또는 변수)가 존재하여 충돌이 발생할 우려를 제거해준다. ====== const 활용 ====== 원주율 등 변하지 않은 상수를 이용하는 경우 변수를 const 로 정의하면 그 값이 변하지 않는 것을 보장할 수 있다. 참고로 const 수식어를 지정하여 변수를 정의하는 경우, 컴파일러에 따라서는 이 변수를 쓰기 금지된(read-only) 메모리 영역에 배치하는 수도 있다. 그 덕분에 메모리 보호(memory protection)가 이루어지는 운영체제에서는 가령 "assignment of read-only location" 경고를 무시하고 억지로 대입문을 실행하여도, 실행시에 오류가 발생하는 수가 있다. ====== 버그가 생기지 않는 코딩 습관 ====== - 하나의 지역 변수를 여러 용도로 사용하지 말 것 - 함수의 인자를 다른 목적으로 이용하지 말 것 - malloc() 과 free()는 서로 가까이 둘 것 - 구조체는 생성과 동시에 초기화하라 - 서로 연관된 코드는 가까이 둘 것 - 포인터는 NULL 로 초기화하자 - 캐스팅을 자제할 것 - 충분히 캐스팅 할 것 - 일관성 있는 이름 붙이기 - sizeof(char)를 명시할 것 - 점검하기 쉬운 스타일을 취할 것 - 자신의 의도를 분명히 드러낼 것 - 충분히 생각한 후에 코딩하라 ====== 버그가 발생했을 때 대처하기 쉬운 코딩 스타일 ====== - 반납한 포인터는 NULL 로 리셋하자 - 함수의 앞부분에서 인자를 검사할 것 ====== 추적을 위한 코딩 스타일 ====== - 서로 연관된 것은 같은 디렉토리에 둘 것 - 함수를 여러 행에 걸쳐서 쓰지 말 것 - grep 으로 검색하는 경우에 대비할 것 - 자작 도구의 활용을 의식할 것 ====== 수정과 확인이 쉬운 코드 ====== - 중괄호를 생략하지 말 것 - return 을 한 군데로 몰아둘 것 - 비슷한 코드는 한 곳에 합쳐둘 것 - 수정 후에는 곧바로 확인 할 것 ====== 장래성이 있는 코드 ====== - 블록이 깊게 중첩되지 않도록 할 것 - goto 의 사용을 꺼리지 말 것 충분한 사유가 있어서 일정한 분량의 코드를 한꺼번에 뛰어넘는 goto 를 구사하는 것은 꺼릴 필요가 없다. 물론 if(){...} 같은 일반적인 기술 방식을 사용할 수 있는 경우에는 굳이 goto 를 사용할 필요가 없고, goto 를 사용하는 경우에는 코드의 위아래를 오가는 스파게티 프로그램이 되지 않도록 조심해서 사용해야 한다. ====== 코딩 단계에서 신경 써야 할 사항 ====== - 게을러 질 것 - 버릇들이기 \\ 미심쩍은 구문은 쓰지 않도록 버릇을 들인다. 잘 생각해본 후에 코딩하는 버릇을 들인다. 나눗셈을 할 때에는 캐스팅을 하도록 버릇을 들인다