본문 바로가기
프로그래밍 언어/C 언어

[C/C++] #ifdef, #if defined() 비교 및 활용

by 까망 하르방 2022. 9. 1.
반응형

[전처리기] #ifdef에서

#ifdef 형태와 활용 방법을 다루었다.

#define IMSI

#ifdef IMSI
#define MAX_SPEED 10
#else
#define MAX_SPEED 100
#endif

int speed;

int main() {
       // 최고 속도이하로 수치조정
       if (speed > MAX_SPEED)
              speed = MAX_SPEED;
}
 

[C] [전처리기] #ifdef

#ifdef 사용되는 형태는 아래와 같다. #ifdef {NAME} ... #else ... #endif {NAME} 선언 여부에 따라 컴파일 되는 부분이 달라진다. #define에서 선언여부와 관계 있지 정의 여부와는 관계가 없다. #define TEST..

zoosso.tistory.com


 

[예제 코드]

#ifdef 대신 #if defined()로 대체할 수도 있다.

#define IMSI

#if defined(IMSI)
#define MAX_SPEED 10
#else
#define MAX_SPEED 100
#endif

int speed;

int main() {
    // 최고 속도이하로 수치조정
    if (speed > MAX_SPEED)
        speed = MAX_SPEED;
}

 

 

Q) 그렇다면 둘의 차이는 무엇일까?

A) #if defined()에서는 여러 항목을 비교할 수 있다.

    → #if defined(FPGA) && (defined(A) || defined(B))

 

 

[예제 코드] #if defined() 

#include <iostream>

using namespace std;

#define B
#if defined(A) || defined(B)
#define MAX_SPEED 10
#else
#define MAX_SPEED 100
#endif

int main()
{
       cout << MAX_SPEED << endl; // 10
}

 

 

주의 사항

#ifdef에서도 여러 항목 비교가 되지 않음에도

해당 형태가 컴파일 Error 나지 않는다.

#include <iostream>

using namespace std;

#define B
#ifdef A || B
#define MAX_SPEED 10
#else
#define MAX_SPEED 100
#endif

int main()
{
       cout << MAX_SPEED << endl; // 100
}

 

개발자 의도는 "B"가 defined 되어 있기 때문에

MAX_SPEED는 "10" 이 되어야 하지만

실제 결과는 "100" 이다.

개발자 의도와 다르지만 컴파일 Error 가 나오지도 않기 때문에

Logic 복잡도에 따라서는 바로 알기 어려울 수 있다.

 

 

Q) #ifdef와 #if defined() 무엇을 사용해야 될까?

A) 확장성 관점에서는 #if defined()라고 볼 수 있다.

     그렇다고 #ifdef 간결함을 놓치고 싶지 않다.

     비교 항목이 많은 경우 계속 늘리기도 망설여진다.

 

📌 클린 코드(Clean Code)란?

 

클린 코드(Clean Code)란?

💻 클린 코드 (Clean Code)? • 프로그래밍을 모르는 사람도 한눈에 읽히는 코드 (가독성) • 다른 사람이 수정하기 쉬운 코드 • 한 가지 일에 집중하는 코드 • 중복이 적은 코드 • 테스트가

zoosso.tistory.com

 

 

상단에 모아서 관리할 수 있긴 하다.

[주의사항]은 여전하지만 🙄

상단에 모아서 defined() 관리

 

[예제 코드]

#include <iostream>

using namespace std;

#define C

#if defined(A) || defined(B) || defined(C)
#define HIGH_STATUS
#endif

#ifdef HIGH_STATUS
#define MAX_SPEED 10
#else
#define MAX_SPEED 100
#endif

int main()
{
    cout << MAX_SPEED << endl; // 10
}

 

 

+ IF) 논의 해본다면

① #ifdef로 통일 (+ 2개 이상은 상단에 모아서 관리)

② #if defined()로 통일

③ 변수 1개는 #ifdef로 변수 2개부터는 #if defined()

④ 전체적인 구조와는 큰 관계가 없으므로 개발자 개인 Style에 맞춰서!

 

 

+ Q) #ifndef는 어떻게 생각해?

#ifdef는 간결하지만 중간에 "n (not)"은 잘 보이지 않는 편이다.

이런 경우는 #if !defined()로 통일하는 것도

하나의 Convention이 될 수 있다.

🤔 느낌표(!)가 있는게 더 직관적이지 않을까...?

반응형

댓글