ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 매크로 expand(STRING_CAT 매크로를 예시로)
    간단기법 2022. 10. 5. 11:14

    STRING_CAT 매크로의 예시

    http://www.kocw.net/home/cview.do?mty=p&kemId=1323571

    매크로에서 문자열을 이어 붙이기 위해 ##(token concatenation) 연산자를 사용한다. 위 코드에서는 DUMMY 매크로는 STRING_CAT 매크로를 이용하고, STRING_CAT 매크로는 ##으로 문자열을 이어 붙인다. 위 코드의 의도는 DUMMY매크로 위치에 int _dummy33 = 0; 처럼 _duumy라는 문자열에 __LINE__으로 얻은 숫자를 이어 붙이려는 것이다. 그러나, 실제 나오는 결과물은 예상과 다르게 int _dummy__LINE__ = 0;이다. 우리의 의도와는 다르게 STRING_CAT(_dummy, __LINE__)을 호출하게 되면 __LINE__이 그대로 문자열로 들어가고, 번호로 평가되지 않는 것이다. 

    매크로 EXPAND 규칙

    http://www.kocw.net/home/cview.do?mty=p&kemId=1323571

     우리가 의도한 바는 __LINE__이라는 매크로가 번호로 대체되는 것이다. 이를 위한 방법이 있다._STRING_CAT이라는 매크로를 생성하여 문자열을 이어 붙이게 하고, 기존의 STRING_CAT은 _STRING_CAT 매크로를 호출하도록 하는 것이다. 이것은 어떠한 원리로 가능한가?

    https://www.iar.com/knowledge/learn/programming/advanced-preprocessor-tips-and-tricks/

    즉, 매크로는 먼저 자신이 정의한대로 확장한다. STRING_CAT(dummy, __LINE__)은 _STRING_CAT(dummy, __LINE__)으로 확장되는 것이다. 그리고, _STRING_CAT(dummy, __LINE__)이 dummy##__LINE__으로 확장되기 전에, __LINE__이 그 의도인 숫자로 대체되는 것이다. 여기서 나오는 object-like macros들은 일반적으로 매크로를 사용할 때, 상수를 대체하는 경우의 매크로를 의미한다. 예를 들어, #define pi 3.14처럼 쓰는 경우가 있다. 여기서는 __LINE__이 이 매크로가 있는 라인 번호로 대체되는 것을 의미한다.

    확인

    실제로 해보면, 매크로가 expand된다고 표현된다.

    테스트 코드
    _STRING_CAT을 이용하여 확장
    _STRING_CAT을 이용한 확장.

     

    댓글

Designed by Tistory.