본문 바로가기
코딩취미/C,C++

[c,c++] 비트마스크 생성방법, 매크로 전처리기 ## 토큰결합연산

by 브링블링 2024. 1. 3.
반응형

비트마스크 생성방법, 매크로 전처리기 ## 토큰결합연산

전처리기 토큰 결합 연산자 활용 : 예) 비트마스크 생성 

토클 결합 연산자를 사용하면 매크로의 유연성을 향상시키고, 다양한 설정에서의 코드 재사용성을 높일 수 있습니다. 이는 특히 큰 프로젝트에서 설정 및 조건에 따라 동적으로 코드를 생성해야 할 때 유용합니다.

#define BIT_NAME_MSK(PeriName,RegName,BitName) (PeriName##RegName##BitName##Msk)

 

BIT_NAME_MSK(A, B, C)를 호출하면 매크로는 다음과 같이 동작합니다:

  1. PeriName은 A로 대체됩니다.
  2. RegName은 B로 대체됩니다.
  3. BitName은 C로 대체됩니다.

따라서 위의 매크로 정의에 따라 BIT_NAME_MSK(A, B, C)는 다음과 같이 해석됩니다:

(A##B##C##Msk)

 

여기서 ##는 토큰 결합 연산자로, 주어진 토큰을 연결하여 하나의 토큰으로 만듭니다. 따라서 위의 식은 ABC##Msk로 확장됩니다. 결과적으로, BIT_NAME_MSK(A, B, C)는 ABC##Msk로 확장되며, 이는 ABCMsk로 최종적으로 해석됩니다.

 

비트마스트 활용방법

#define SET_BIT(Peri,Data,PeriName,RegName,BitName) \
            (Peri->RegName = ((Peri->RegName & ~(BIT_NAME_MSK(PeriName##_,RegName##_,BitName##_))) \
            | (Data << BIT_NAME_POS(PeriName##_,RegName##_,BitName##_))))
반응형

토큰 결합 연산자를 사용하는 목적과 이유

유연한 매크로 정의:

  • 토클 결합 연산자를 사용하면 매크로 정의를 더 유연하게 만들 수 있습니다. 예를 들어, 특정 기능을 활성화 또는 비활성화하려는 경우 유용합니다.
#define FEATURE_ENABLED 1

#if FEATURE_ENABLED
// 특정 기능을 활성화하는 코드
#else
// 특정 기능을 비활성화하는 코드
#endif

 

코드 재사용성:

  • 토클 결합 연산자를 사용하면 유사한 매크로를 여러 번 재사용할 수 있습니다. 예를 들어, 여러 개의 매크로가 동일한 패턴을 가지고 있을 때 코드 중복을 방지합니다.
#define LOG_DEBUG(message)   printf("[DEBUG] %s\n", message)
#define LOG_ERROR(message)   printf("[ERROR] %s\n", message)

int main() {
    LOG_DEBUG("This is a debug message.");
    LOG_ERROR("This is an error message.");
    return 0;
}

 

동적인 식별자 생성:

  • 토클 결합 연산자를 사용하면 동적인 식별자를 생성할 수 있습니다. 이는 특히 코드 생성이나 코드 생성기와 같은 상황에서 유용합니다.
#define CONCAT(a, b) a##b

int main() {
    int CONCAT(var, 1) = 42;  // var1으로 변수가 생성됨
    return 0;
}

 

선택적으로 코드 포함:

  • 매크로 정의를 조건에 따라 선택적으로 활성화 또는 비활성화할 수 있습니다. 이는 컴파일 시간에 특정 기능을 선택적으로 활성화하는 데 사용됩니다.
#define FEATURE_A_ENABLED 1
#define FEATURE_B_ENABLED 0

#if FEATURE_A_ENABLED
// FEATURE_A_ENABLED가 정의되어 있는 경우 활성화되는 코드
#endif

#if FEATURE_B_ENABLED
// FEATURE_B_ENABLED가 정의되어 있는 경우 활성화되는 코드
#endif

 

컴파일 시간에 다양한 설정 적용:

  • 토클 결합 연산자를 사용하면 컴파일 시간에 다양한 설정을 갖는 코드를 생성할 수 있습니다. 이는 플랫폼에 따라 다른 코드를 생성해야 하는 경우에 유용합니다.
#define PLATFORM_WINDOWS 1
#define PLATFORM_LINUX   0

#if PLATFORM_WINDOWS
// Windows 플랫폼에서 실행되는 코드
#elif PLATFORM_LINUX
// Linux 플랫폼에서 실행되는 코드
#endif

 

반응형