2.6 Defining Names for Constants

프로그램에 상수가 포함되어 있을 때는 종종 상수에 이름을 붙이는 것이 좋다. dweight.c나 dweight2.c 프로그램은 상수 166에 의존하는데, 그 의미는 프로그램을 읽는 다른 사람에게 모호할 수 있다. 매크로 함수를 이용하여, 이 상수의 이름을 다음과 같이 지을수 있다.

#define INCHES_PER_POUND 165

#define은 #include와 마찬가지로 전처리문이기에, 줄의 끝에는 세미콜론을 붙이지 않는다.

프로그램이 컴파일될 때, 전처리기는 각각의 매크로를 그것이 나타내는 값으로 대체한다. 예를 들어 다음 문장은

weight = (volume + INCHES_PER_POUND -1) / INCHES_PER_POUND;

 다음과 같이 

weight = (volume + 166 -1) / 166;

뒤의 문장을 쓴 것과 같은 효과가 나타난다. 매크로의 값은 expression(수식)으로 될 수 있다.

#define RECIPREOCAL_OF_PI (1.0f / 3.14159f)

만약 연산자를 포함한다면, 식을 괄호로 묶어주어야한다. 

매크로 이름에는 대문자만 사용했는데, 이것은 대다수의 C프로그래머들이 따르는 규칙이다. (필수사항은 아니다.)

그렇지만 관례가 있기에 이 규칙을 따르는 것이 좋을 것이다.

PROGRAM: Converting from Fahrenheit to Celsius

다음 프로그램은 사용자에게 화씨 온도를 입력하라는 메시지를 표시하고 동일한 섭씨 온도를 인쇄한다. 프로그램의 출력은 다음처럼 된다.

Enter Fahrenheit temperature: 212 //212는 사용자 입력값
Celsius equivalent: 100.0

이 프로그램은 정수가 아닌 온도도 허용해야하기에, 섭씨온도가 100이 아닌 100.0으로 표시된다. 

/* Convers a Fahrenheit temperature to Celsius */

#include <stdio.h>

#define FREEZING_PT 32.0f
#define SCALE_FACTOR (5.0f / 9.0f)

int main(void)
{
	float fahrenheit, celsius;
    
    printf("Enter Fahrenheit temperature: ");
    scanf("%f", &fahrenheit);
    
    celsius = (fahrenheit - FREEZING_PT) * SCALE_FACTOR;
    
    printf("Celsius equivalent: %.1f\n", celsius);
    
    return 0;
}

문장 celsius = (fahrenheit - FREEZING_PT) * SCALE_FACTOR;는 화씨 온도를 섭씨로 바꿔준다. FREEZING_PT가 32.0f를 의미하고, SCALE_FACTOR가 (5.0f / 9.0f) 를 의미하기에 컴파일러는 다음처럼 해석한다.

celsius = (fahrenheit - 32.0f) * (5.0f / 9.0f);

SCALE_FACTOR를 (5.0f / 9.0f)로 쓰는것은 중요한 사항이다. 5/9로 쓴다면 C가 두 정수가 나뉘는 것으로 생각하여 자른 결과를 준다. 5/9는 0이 될 것이고, 우리가 원하는 결과가 나오지 않는다.

printf의 호출은 섭씨를 기록하기 위함이다. %.1f를 사용하여 섭씨가 소숫점 뒤 한자리만 나오도록 표시했다.

+ Recent posts