>백엔드 개발 >C++ >C 전처리에서 매크로 확장 순서가 문자열화에 어떤 영향을 미칩니까?

C 전처리에서 매크로 확장 순서가 문자열화에 어떤 영향을 미칩니까?

DDD
DDD원래의
2024-12-19 14:10:10774검색

How Does Macro Expansion Order Affect Stringification in C Preprocessing?

문자열화의 마법 공개

프로그래밍 영역에서 문자열화는 매크로가 다음을 기반으로 문자열을 동적으로 생성할 수 있도록 하는 다용도 기술입니다. 그들의 주장. 이 프로세스가 어떻게 진행되는지 이해하는 데 중요한 것은 매크로 확장이 발생하는 세심한 순서입니다.

다음 매크로 정의를 고려하세요.

#define foo 4
#define str(s) #s

str(foo)가 평가되면 다음과 같은 결과가 발생합니다. 문자열화 작업(#)이 텍스트 확장보다 우선하기 때문에 #을 "foo"로 확장합니다. 그러나 매크로 간접 참조의 추가 레이어를 도입하면 작업 순서가 중요해집니다.

xstr(foo)의 사례

매크로 xstr(s) 정의 as:

#define xstr(s) str(s)
#define str(s) #s
#define foo 4

이 매크로를 xstr(foo)에 적용하면 "4"라는 예상치 못한 결과가 발생합니다. 이 미스터리를 푸는 열쇠는 다음 매크로 확장 단계에 있습니다.

  1. # 또는 ## 접두사가 붙은 토큰을 전처리합니다.
  2. 매크로 인수 내에서 매크로를 확장합니다.
  3. 매크로 매개변수를 해당 대체 텍스트로 대체합니다.
  4. 추가 매크로를 보려면 결과를 다시 스캔하세요. 확장.

xstr(foo)이 처리될 때:

  1. xstr(s)의 #이 식별됩니다.
  2. foo는 4로 대체됩니다.
  3. str(s)의 #s는 다음과 교체됩니다. #4.
  4. str(4)가 이제 다시 검색됩니다.

#4는 문자열 리터럴이므로 "4"로 확인됩니다. 따라서 문자열화 작업은 텍스트 확장 후에 적용되므로 xstr(foo)는 "foo"가 아닌 "4"로 평가됩니다.

A Lesson in Macro Order

이것은 겉보기에 반직관적인 결과는 거시적 질서의 중요성을 강조합니다. 이러한 모호함을 피하기 위해 문자열화 작업을 적용하기 전에 도우미 매크로를 사용하여 한 단계를 실행하는 것이 권장되는 경우가 많습니다. 이렇게 하면 작업 순서를 명확하게 정의하여 원하는 결과를 얻을 수 있습니다.

위 내용은 C 전처리에서 매크로 확장 순서가 문자열화에 어떤 영향을 미칩니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.