Professional Documents
Culture Documents
초보자를 위한 C언어 프로그램 스타일 가이드 3
초보자를 위한 C언어 프로그램 스타일 가이드 3
Beginner Corner
초보자를위한
C 언어프로그램스타일가이드 Ⅲ
지난 호에는 공백 사용, 단문 및 복합문, 연산자 등에 대해서 살펴보았다. 이번 호에는 어떻게 하면 우수한
이식성을 갖춘 프로그램을 작성할 수 있을까? 프로그램을 작성하는데 있어 가장 중요한 이식성(Portability)에 대해서
알아보자.
106
초보자를 위한 C 언어 프로그램 스타일 가이드 Ⅲ
Language”
에서는 위와 같은 용어를 많이 사용하고 있다).
표 1. C 언어 기본 타입의 크기
변한다. 다음 표 2는 대부분의 시스템에서 확실한 타입의 크기 type minimum Bits No Smaller than
분한 공간 확보를 보장한다.“void(*)()”
는 함수의 포인터를 any* 14
char* 15 any*
담을 수 있다. generic 포인터(편주: 어떤 타입이든지 담을
void* 15 any*
수 있는 포인터)가 필요할 때는 위와 같은 타입을 이용하면
된다(구식 컴파일러는 char*, char(*)()를 사용). 위의 경우
에서 이들 변수를 사용하기 전에는 사용하고자 하는 정확한 ■integer 상수 0(zero)은 어떤 포인터 타입(type)으로도 형
타입으로 형변환(cast)시켜야 함을 주지해야 한다. 변환이 될 수 있다. 이것을 null 포인터라고 하며 같은 타입
의 다른 일반적인 포인터와는 다르다. null 포인터는 상수
■
“int*”
와“char*”
가 서로 같은 크기라 할지라도 이들은 서 0과 같은 지를 비교할 수 있다. 반면에 null 포인터는 0의
로 다른 형태(format)를 갖고 있는 경우가 있다. 예를 들어 값을 갖고 있는 일반적인 변수와는 같은 지를 비교할 수 없
아래와 같은 문장은 sizeof(int*)와 sizeof(char*)가 같은 을 수도 있다.
기계라 할지라도 제대로 실행되지 않는 경우가 있음을 보
여준다. 즉 free 함수는“*char”
를 받는 것으로 인식했으 null 포인터는 항상 모든 비트가 0으로 구성된 것만은 아니며
나 실제로는“*int”
를 받음으로서 제대로 동작을 못한다. 서로 다른 타입의 null 포인터는 다를 수도 있다. 어떤 null 포
인터를 다른 타입의 포인터로 형변환을 하면 변환되는 타입의
int*p = (int *)malloc(sizeof(int)); null 포인터로 형변환된다.
free(p);
■2의 보수(2’
s complement) 표현을 이용하여 프로그램하
만약 null이 아닌“magic”포인터(편주: 일반 변수처럼 사 지 말아야 한다. 일반적으로 수식계산에서 shift 연산을 대
용하는 포인터 변수)가 필요하다면 어떤 공간을 확보하거 체하는 최적화 방안으로 사용되는 경우가 이에 해당된다고
나, 기계종속적인 포인터로서 취급하여야 한다. 하겠다.
만약 굳이 필요하다면 기계 종속적인 코드에 #ifdef을 사용
extern int x_int_dummy; /* in x.c */ 하거나, 프로그램에는 #ifdef 매크로를 사용하여야 한다.
#define X_FAIL (NULL) 프로그램이 이식(porting)될 때 잡기 어려운 버그와 불분
#define X_BUSY (&x_int_dummy)
명함에 의한 문제에 대처하여 시간을 절약하기 위해 이에
대해 비중을 두어야 한다.
#define X_FAIL (NULL)
#define X_BUSY MD_PTR1
/* MD_PTR1 from“machine.h”*/
■Word 크기나 값의 허용치(value range)가 중요하다면
typedef을 사용하여야 한다. 큰 프로그램에서는 이전 프로
그램에 공통적으로 사용되는 type의 크기에 민감한 것
■float 값은 정밀도(precision)와 범위(range)로 구성된다 (width-sensitive)과 관련한 파일을 갖고 있는데, 이렇게
(편주: 컴퓨터는 부동소수값을 가수와 지수로 분리하여 처 관리함으로써 크기에 민감한 코드를 찾는데 도움을 얻을
리한다). 그리고 이것은 객체(변수)의 크기에 독립적으로 수 있어 이후 수정시 쉽게 작업할 수가 있다. 단순한 순환
처리된다. 문에서 16비트나 32비트를 사용할 수 있는 카운터의 경우
그러므로 32비트 부동소수값의 overflow/underflow는 서 는 integer를 사용하는 것이 유리하다. 이는 기계에서 가장
로 다른 기계에서 서로 다른 값을 갖게 된다. 마찬가지로 최적하게 돌아갈 수 있는 단위이기 때문이다.
4.9 곱하기 5.1의 값은 두 개의 서로 다른 기계에서 서로 다
른 값을 갖게 된다. rounding과 truncation은 놀랄만한 차 ■데이터 정열에 주의하여야 한다(data alignment). 예를 들
이를 일으킨다. 면 다양한 기계에서 4바이트 integer가 어떠한 메모리 번
지에 위치하거나 혹은 짝수번지에 위치할 수도 있다. 그러
■어떤 기계에서는 double이 float보다 정밀도(precision)와 므로 비록 타입의 크기가 같은 이기종이라고 할지라도
범위(range)가 적은 경우도 있다. struct에서 각각의 멤버는 다양한 기계에서 위치가 서로
다르게 될 수 있다.
■signed char를 주의하여야 한다. 어떤 VAX 기계는 다른
일반적인 기계와는 달리 수식에서 사용될 때 char가 ■기종에 따라서는 주소가 증가하는 경우에 Word 안의 바이
signed extended 된다. 코드가 signed나 unsigned를 가 트가 증가하는 순서로 배열된 경우도 있고(little-endian),
정하고 있다면, 이는 이식성이 좋지 않은 경우가 된다. 만 또는 감소하는 순으로 배열된 경우도(big-endian) 있음을
약 부득이 signed나 unsigned를 가정하려고 한다면, 이에 주지하여야 한다. 즉, Word 안의 바이트(byte)의 정열순서
108
초보자를 위한 C 언어 프로그램 스타일 가이드 Ⅲ
char c1,c2,c3;
x &=0177770;
{
char bar = *(&c1 + 1);
return(bar); /* often wo’nt return c2 */ 다음과 같은 코드는 모든 기종에서 사용가능하며 위의 문제
} 를 피할 수 있는 코드이다.
x &=~07;
110