-
매크로 expand(STRING_CAT 매크로를 예시로)간단기법 2022. 10. 5. 11:14
STRING_CAT 매크로의 예시
매크로에서 문자열을 이어 붙이기 위해 ##(token concatenation) 연산자를 사용한다. 위 코드에서는 DUMMY 매크로는 STRING_CAT 매크로를 이용하고, STRING_CAT 매크로는 ##으로 문자열을 이어 붙인다. 위 코드의 의도는 DUMMY매크로 위치에 int _dummy33 = 0; 처럼 _duumy라는 문자열에 __LINE__으로 얻은 숫자를 이어 붙이려는 것이다. 그러나, 실제 나오는 결과물은 예상과 다르게 int _dummy__LINE__ = 0;이다. 우리의 의도와는 다르게 STRING_CAT(_dummy, __LINE__)을 호출하게 되면 __LINE__이 그대로 문자열로 들어가고, 번호로 평가되지 않는 것이다.
매크로 EXPAND 규칙
우리가 의도한 바는 __LINE__이라는 매크로가 번호로 대체되는 것이다. 이를 위한 방법이 있다._STRING_CAT이라는 매크로를 생성하여 문자열을 이어 붙이게 하고, 기존의 STRING_CAT은 _STRING_CAT 매크로를 호출하도록 하는 것이다. 이것은 어떠한 원리로 가능한가?
즉, 매크로는 먼저 자신이 정의한대로 확장한다. STRING_CAT(dummy, __LINE__)은 _STRING_CAT(dummy, __LINE__)으로 확장되는 것이다. 그리고, _STRING_CAT(dummy, __LINE__)이 dummy##__LINE__으로 확장되기 전에, __LINE__이 그 의도인 숫자로 대체되는 것이다. 여기서 나오는 object-like macros들은 일반적으로 매크로를 사용할 때, 상수를 대체하는 경우의 매크로를 의미한다. 예를 들어, #define pi 3.14처럼 쓰는 경우가 있다. 여기서는 __LINE__이 이 매크로가 있는 라인 번호로 대체되는 것을 의미한다.
확인
실제로 해보면, 매크로가 expand된다고 표현된다.
'간단기법' 카테고리의 다른 글
PHP 문득 궁금한거 생길때 정리 (0) 2023.05.16 동적인 데이터를 처리하는 다양한 방법. (0) 2023.03.13 문자열 뒤집기 두 가지 버전 (0) 2022.09.17 [PowerShell] 디렉토리에서 postfix 없애기 (0) 2022.09.17 switch-case 문에서 case가 많을 때, 간단하게 줄이는 방법 (1) 2021.05.09