본문 바로가기
개념/혼자 공부하는 C언어

chapter 19) #if, #ifdef, #else , #endif 를 사용한 조건부 컴파일

by kiseno 2024. 10. 17.
728x90
반응형
SMALL
#include <stdio.h>
#define VER 7
#define BIT16

int main(void){
    int max;

#if VER >= 6
    printf("version %d.\n", VER);
#endif

#if def BIT16
    max = 32767;
#else
    max = 2147483647;
#endif
    printf("max of integer parameter : %d\n", max);

    return 0;
}

### 코드 설명

1. **매크로 정의**:
   - `#define VER 7`: `VER`라는 매크로를 값 `7`로 정의합니다.
   - `#define BIT16`: 값을 지정하지 않고 `BIT16` 매크로를 정의합니다. `BIT16`이 정의되었는지 여부를 확인하기 위해 `#ifdef` 또는 `#if defined` 검사에서 `BIT16`의 존재만으로 충분합니다.

2. **조건부 컴파일**:
   - `#if VER >= 6` 전처리 지시어는 `VER` 매크로가 정의되었고 그 값이 `6` 이상인지 확인합니다. 참이면, 이 안에 있는 `printf`문을 컴파일하고 실행하여 버전 번호를 출력합니다.
   - `#if def BIT16` 지시어는 오타나 오류인 것 같습니다. 올바른 사용법은 `#ifdef BIT16` 또는 `#if defined(BIT16)`입니다. 이 지시어는 `BIT16`이 정의되었는지 확인합니다:
     - `BIT16`이 정의된 경우, `max`는 `32767`로 설정되어 16비트 정수의 최대값을 나타냅니다.
     - `BIT16`이 정의되지 않은 경우, `else` 블록은 `max`를 `2147483647`로 설정하여 32비트 정수의 최대값을 나타냅니다.

3. **`max` 출력**: 
   - 어느 블록이 컴파일되든 마지막 `printf` 문은 `max`의 값을 출력합니다.

### 수정 및 개선 사항

- `#if def BIT16` 지시어는 `#ifdef BIT16` 또는 `#if defined(BIT16)`로 수정되어야 `BIT16`의 정의 여부를 제대로 확인할 수 있습니다.
- 이식성과 명확성을 보장하기 위해 `BIT16`의 의미와 이것이 `max` 값에 어떤 영향을 미치는지 설명하는 간단한 주석을 포함하는 것도 좋습니다.

### 조건부 컴파일 부분의 수정된 버전

```c
#if defined(BIT16)
    max = 32767; // 16비트 정수의 최대값으로 max 설정
#else
    max = 2147483647; // 32비트 정수의 최대값으로 max 설정
#endif
```

이 수정을 한 후에 프로그램은 `BIT16`이 정의되었는지 제대로 확인하고 `max` 변수를 그에 따라 설정합니다. 이는 사전 정의된 매크로를 기반으로 단일 코드베이스 내에서 다양한 구성, 환경 또는 버전을 처리하는 데 특히 유용한 조건부 컴파일의 간단하지만 효과적인 사용을 보여줍니다.

728x90
반응형
LIST