>백엔드 개발 >C++ >C와 유사한 매크로 확장에서 `str(foo)`가 'foo'를 출력하는 동안 `xstr(foo)`는 '4'를 출력하는 이유는 무엇입니까?

C와 유사한 매크로 확장에서 `str(foo)`가 'foo'를 출력하는 동안 `xstr(foo)`는 '4'를 출력하는 이유는 무엇입니까?

Linda Hamilton
Linda Hamilton원래의
2024-12-28 14:30:11210검색

Why Does `xstr(foo)` Output

문자열화 이해: 매크로 확장의 주요 단계

C 유사 언어의 문자열화 개념을 사용하면 표현식을 문자열로 변환할 수 있습니다. 효과적인 매크로 사용을 위해서는 이 프로세스에 포함된 단계를 이해하는 것이 중요합니다.

문제: 출력 차이

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

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

코드에서 str(foo)를 사용하면 텍스트 확장(단계) 전에 문자열화(1단계)가 수행되므로 "foo"가 출력됩니다. 2).

그러나 추가 매크로를 정의하는 경우:

#define xstr(s) str(s)

그리고 xstr(foo)를 사용하면 놀랍게도 "4"가 출력됩니다. 이러한 차이를 보려면 문자열화 프로세스를 탐색해야 합니다.

매크로 확장 단계

매크로 확장 프로세스에는 C 및 C 표준에 따라 여러 단계가 포함됩니다.

  1. 전처리: # 또는 ## 앞에 오는 토큰은 처리됩니다.
  2. 인수 대체: 각 인수에 매크로가 적용됩니다.
  3. 매개변수 대체: 매개변수가 해당 매크로 결과로 대체됩니다.
  4. 재검색 중: 추가 매크로를 위해 코드를 다시 검색합니다. 확장.

xstr(foo)에 단계 적용

  1. 전처리: 적용 가능한 토큰이 없습니다.
  2. 인수 대체: foo는 다음으로 대체됩니다. 4.
  3. 매개변수 대체: str(s)에서 s는 4로 대체되어 str(4)을 생성합니다.
  4. 재검색: str (4)가 다시 스캔되어 출력됩니다. "4".

str(foo)가 "foo"를 출력하는 이유

xstr(foo)와 달리 str(foo)는 "foo"를 생성합니다. 이유:

  • 전처리: 문자열화 없음 토큰이 존재합니다.
  • 인수 대체: 해당 없음.
  • 매개변수 대체: foo가 4로 대체되지 않았기 때문에 #foo는 변경되지 않습니다.
  • 다시 검색 중: #foo는 그렇지 않습니다. 다시 스캔하여 "foo"를 생성합니다.

따라서 xstr과 같은 도우미 매크로를 사용하면 문자열화(1단계) 전에 텍스트 확장(2단계)이 수행되어 올바른 문자열 변환이 가능해집니다.

위 내용은 C와 유사한 매크로 확장에서 `str(foo)`가 'foo'를 출력하는 동안 `xstr(foo)`는 '4'를 출력하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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