일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |
- 공부
- 리눅스
- 리눅스 오류
- conda
- essential deep learning paper reading
- 머신러닝
- conda: command not found
- pytorch tensor
- torch
- Machine Learning
- Tensor
- Ai
- 일귀
- stm32f 시리즈를 이용한 arm cortex-m3/m4 구조와 응용
- anaconda오류
- conda오류
- ML
- 텐서
- pyTorch
- Today
- Total
Embedded World
[C] C언어의 조건부 컴파일 지시자(#if #ifdef #ifndef #endif) 본문
C는 값 또는 식을 기준으로 조건부 컴파일을 수행할 수 있다.
#define <매크로> <값>
#define은 <값>을 <매크로>로 치환해준다.
#include <stdio.h>
#define PI 3.141592
int mian(void){
print("%d\n", PI);
return 0;
}
#if <조건식>
<조건식>이 참이면, #if와 #endif 사이의 코드를 컴파일한다. 이는 보통 중복 컴파일을 방지하기 위해 사용된다.
#if 값 or 식
코드
#endif
#if, #endif 는 전처리기 과정을 거치면 조건이 참인 코드만 남는다.
#include <stdio.h>
#define PI 3.14
int main(void){
#if PI == 3.14
printf("PI는 3.14");
#elif PI > 3.14
printf("PI값이 좀 이상한데?");
#endif
prinf("PI값이 3.14보다 작다.");
return 0;
}
(전처리기 거치기 전)
#include <stdio.h>
#define PI 3.14
int main(void){
printf("PI는 3.14");
return 0;
}
(전처리기 이후)
#if defined <매크로> / ifdef <매크로>
#ifdef 와 #if defined 그리고 #ifndef 와 #if !defined 의 용도는 같다. 그러나 #ifdef와 #ifndef는 매크로명의 정의 여부만 확인 가능하니 다른 연산자와 함께 조건식을 만들 땐 defined 나 !defined를 사용해야한다.
#if defined <매크로>
코드
#endif
예를 들면 이런 코드가 가능하다.
#include <stdio.h>
#define DEBUG
#define TEST
int main(){
#if (defined DEBUG || degined TEST) && !defined (VERSION_1)
printf("Debug\n");
#endif
return 0;
}
>> 전처리 전
#include <stdio.h>
#define DEBUG
#define TEST
int main(){
printf("Debug\n");
return 0;
}
>> 조건이 참이므로 코드는 남게된다.
#if는 다음처럼 DEBUG 매크로를 정의해 사용한다.
#define DEBUG 1처럼 코드에서 1,0을 설정해 디버그 코드 사용 여부를 제어하거나
컴파일 시 DEBUG 매크로를 매개변수로 주며 디버그 코드를 제어할 수 도 있다.
(GCC 컴파일러의 경우, -D매크로이름, -D매크로이름=값)
$ gcc main.c -DDEBUG
$ gcc main.c -DDEBUG_LEVEL=2
#define DEBUG 1 // 코드에서 디버그 코드 제어
#if DEBUG
printf("Debug message\n");
#endif
#ifdef DEBUG // 코드에서 DEBUG 매크로를 정의했거나, 컴파일 옵션에서 DEBUG 매크로 설정
printf("Debug"\n);
#endif
#ifdef DEBUG_LEVEL >= 2
printf("Debug Level more than two\n");
#endif
>>> Debug message, Debug, Debug Level more than two 라고 출력될거다.
#elif 와 #else
#ifdef 매크로
코드1
#elif defined 매크로
코드2
#else
코드3
#endif
#if 조건식
코드4
#elif 조건식
코드5
#else
코드6
#endif
예시 코드!
#include <stdio.h>
#define USB
int main()
{
#ifdef PS5 // PS5가 정의되어있을 때 코드를 컴파일
printf("PS5\n");
#elif defined USB
printf("USB\n");
#else
printf("지원하지 않는 장치입니다.\n");
#endif
return 0;
}
>>> "USB"
#ifndef <매크로>
#ifndef는 매크로가 정의되어있지 않을 때 코드를 컴파일한다.
#ifndef 매크로
#define __EXAMPLE_H
코드
#endif /* __EXAMPLE_H */
#include <stdio.h>
#define NODEBUG
int main()
{
#ifndef DEBUG
// do something
#endif
return 0;
}
>>> do something이 실행된다.
reference: https://dojang.io/mod/page/view.php?id=664 / 책 "혼자서 공부하는 C언어" p567
'소프트웨어 > C' 카테고리의 다른 글
[C] 헤더파일에 대하여 (0) | 2025.08.02 |
---|---|
[C] C언어의 extern 키워드 (0) | 2025.07.30 |
[C] C의 파일시스템, fopen_s() (0) | 2025.07.24 |
[C] volatile 키워드 (0) | 2025.06.23 |
[C/C++] #include "ex.h" 과 <ex.h>의 차이 (0) | 2025.03.26 |