반응형
비트마스크 생성방법, 매크로 전처리기 ## 토큰결합연산
전처리기 토큰 결합 연산자 활용 : 예) 비트마스크 생성
토클 결합 연산자를 사용하면 매크로의 유연성을 향상시키고, 다양한 설정에서의 코드 재사용성을 높일 수 있습니다. 이는 특히 큰 프로젝트에서 설정 및 조건에 따라 동적으로 코드를 생성해야 할 때 유용합니다.
#define BIT_NAME_MSK(PeriName,RegName,BitName) (PeriName##RegName##BitName##Msk)
BIT_NAME_MSK(A, B, C)를 호출하면 매크로는 다음과 같이 동작합니다:
- PeriName은 A로 대체됩니다.
- RegName은 B로 대체됩니다.
- 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
반응형
'코딩취미 > C,C++' 카테고리의 다른 글
C#과 C++의 주요 차이점 5가지 비교 정리 (0) | 2024.01.04 |
---|---|
[c,c++] #ifndef 과 #if !define()의 차이점 (0) | 2024.01.04 |
[MFC] Ribbon 구조 정의 XML 및 XML 정렬 사이트(Formatted XML) (0) | 2023.12.23 |
[MFC] ribbon.mfcribbon-ms 리소스 xml 편집 : RibbonBarEditor, Application Buttion 수정관련 (0) | 2023.12.22 |
[C#] 멀티스레드(MTA) 환경에서 프로그램 재시작하는 방법 (0) | 2023.12.20 |