Professional Documents
Culture Documents
Beginner Corner
초보자를위한
C 언어프로그램스타일가이드 IV
지난 호에는 우수한 프로그램을 작성하는데 있어 가장 중요한 이식성(Portability)에 대해서 알아보았다. 이번 호는
본 연재기사의 마지막으로 그 외 상수, 조건부 컴파일, 고려사항 등에 대해 살펴보도록 하자.
112
초보자를 위한 C 언어 프로그램 스타일 가이드 IV
#define ZERO 0
#endif
#define OFF_A( ) (a_global+OFFSET) #define STMT( stuff ) do{ stuff } while (ZERO)
#define BORK( ) (zork( ))
#define SP3( ) if(b) {int x;av=f(&x);bv += x; }
조건부 컴파일은 기계종속성, 디버깅(debugging), 그리고 컴 위 프로그램에서는 다음과 같은 두 가지 점에서 좋지가 않다.
파일시에 어떤 옵션들을 설정하는데 유용하게 사용된다. 그러 첫 번째는 BSD4 시스템에서 위와 같은 기능을 수행하는 더욱
나 조건부 컴파일은 사용시 주의해야 한다. 전혀 예기치 못한 좋은 코드가 있을 수도 있으며, 반면에 BSD4가 아닌 시스템에
기능들을 쉽게 결합시킬 수 있기 때문이다. #ifdef를 사용하여 서 위와 같은 코드가 가장 좋은 코드일 수도 있다는 점이다. 두
기계종속성을 해결할 경우, 만약 타깃 디바이스를 정해주지 않 번째는 #ifdef 문장에서 심벌(symbol)‘t’대신에 TIME_
았다면, 이 결과는 오류(error) 상황이지 기본상황(default)으 LONG이나 TIME_STRUCT 등으로 사용해야 한다는 점이다.
로 선택된 것이 아니라는 것을 주의해야 한다. 그리고 이들은 config.h와 같은 상황설정에 관련된 파일에 위
또한 #ifdef을 사용하여 선택적으로 최적화(optimize)할 경 치시키는 것이 좋다.
우, 기본상황으로 컴파일할 때는 최적화할 수 없는 코드이지 컴
파일할 수 없는 코드가 아님을 주의해야 한다. 즉 최적화할 수
ANSI C
없는 코드인지 아닌지 항상 확인해야 한다.
#ifdef 부분이 거짓(false)이라고 할지라도 어떤 컴파일러는 많은 C 컴파일러는 ANSI C 표준을 지원한다. 가능하다면 표
#ifdef 문장을 처리(scanned)하기도 한다. 그러므로 #ifdef 문 준 C에 따라 프로그램하는 것이 좋다. 그리고 함수선언, 상수,
장이 절대 컴파일 되지 않는다고 해도 임의의 문장을 장황하게 volatile 등의 기능을 이용해야 한다. 표준 C는 최적화하기 쉽
써서는 안된다. 도록 많은 소스들이 있어 속도를 증진시킬 수 있다. 표준 C는
#ifdef 문장은 가능하면 프로그램 파일에 위치시키지 말고 헤 모든 컴파일러에서 사용될 수 있도록 하고, 기계종속성을 피할
더파일에 위치시켜야 한다. 프로그램에서 일관성 있게 사용되 수 있는 기능을 제공함으로써 이식성을 증가시키고 있다.
는 매크로를 정의하기 위해서는 #ifdef를 사용해야 한다. 예를
들면 메모리 할당을 검증(checking)하기 위한 헤더파일은 다음 호환성(compatibility)
과 같다. 프로그램 작성시 컴파일러에 이식하기 쉽도록 한다. 예를 들
어, global.h 파일에 const나 volatile에 대해‘#define new’
예약어를 사용하여 조건적으로 컴파일할 수 있도록 한다. 표준
#ifdef DEBUG
#else
나 void �를 사용하지 못하는 경우가 많으므로 void �를 사용
#endif
정의해 사용하는 것이 쉽다(컴파일러에서는 void �대신에
char �를 사용한다).
114
초보자를 위한 C 언어 프로그램 스타일 가이드 IV
#endif bork(char c)
#ifdef ... {
... ...
#endif
#ifdef COMPILER_SELECTED
#undef COMPILER_SELECTED 위와 같은 문장은 ANSI C가 아닌 경우에 문제가 발생하므
#else
로, 다음과 같은 방법을 이용하여 ANSI와 ANSI가 아닌 C 언어
{ NO TARGET SELECTED! }
에서 공용으로 사용할 수 있도록 한다.
#endif
#ifdef __STDC__
ANIS C에서는 전처리 명령어를 나타내는 # 심벌이 줄의 처 #define PROTO(x) x
음에 놓이나, C에서는 줄의 처음 글자가 # 심벌로 시작되면 안 #else
된다. #define PROTO(x) ( )
#endif
형선언(Prototypes) extern char �ncopies PROTO((char �s, short times));
함수의 선언(function prototype)은 코드를 더욱 완벽하게
하고 처리속도를 증가시키기 위해서 꼭 사용해야 한다.
다음과 같은 함수선언은 위 문장에서 PROTO는 이중괄호로 되어있음을 주의해야
한다.
주요 고려사항(special consideration)
if(abool) { ...
�코드의 설계로부터 프로그램의 구조가 명확히 드러나도록
공백과 주석을 적절히 사용한다. 가능하면 이해가 쉽도록
단순한 문장과 함수를 사용해야 한다.
내재된 할당문(embedded assignment)을 사용할 때는 test �당신이나 다른 사람이 코드를 변형시킬 것을 요청받거나
문을 명백하게 나타내줌으로써 후에 다시 수정하는 문제를 피 다른 기계에서 실행시켜야 될지도 모른다는 것을 염두에
할 수 있다. 두어야한다.
�많은 스타일 중에 선택은 임의적이다. 일관된 스타일을 갖
while((abool = bbool) != FALSE) { ... 는다는 것이 절대적인 규칙에 따르는 것 보다 중요하다. 혼
while(abool = bbool) { ... /� VALUSED�/ 합된 스타일이 하나의 나쁜 스타일 사용보다 훨씬 못하다.
while(abool = bbool,abool) { ... �어떤 표준을 갖고 있다하더라도, 그것이 유용하다면 따라
야한다. 만약 이 표준들을 따르는데 문제가 있다고 할지라
도 단순히 그것을 무시해서는 안된다.
�최근 컴파일러는 변수들을 레지스터에 자동적으로 할당한
다. 자주 사용되는 변수는 레지스터 변수로 선언해 주는 것
이 좋다.
116