>백엔드 개발 >C++ >문자열화가 한 경우에는 'foo'를 생성하고 다른 경우에는 '4'를 생성하는 이유는 무엇입니까?

문자열화가 한 경우에는 'foo'를 생성하고 다른 경우에는 '4'를 생성하는 이유는 무엇입니까?

Linda Hamilton
Linda Hamilton원래의
2024-12-24 04:20:10965검색

Why Does Stringification Produce

문자열화 풀기: 단계별 설명

문자열화는 주어진 토큰을 문자열 리터럴로 변환하는 강력한 매크로 기술입니다. 복잡한 내용을 이해하기 위해 다음 시나리오를 살펴보겠습니다.

define foo 4

define str(s) #s

str(foo)를 사용하면 예상되는 출력은 " foo"는 문자열화가 텍스트 확장 전에 발생한다고 믿기 때문입니다. 그러나 두 번째 예에서는

define xstr(s) str(s)

define str(s) #s

define foo 4

xstr(foo)의 출력은 "4"가 됩니다. 이러한 불일치를 해결하기 위해 매크로 확장과 관련된 특정 단계를 자세히 살펴보겠습니다.

  1. 전처리 지시문: # 또는 ##으로 시작하는 매크로가 먼저 처리됩니다.
  2. 인수 대체: 매크로 내의 인수는 해당 인수로 대체됩니다. 값.
  3. 매개변수 대체: 매개변수는 해당 인수 값으로 대체됩니다.
  4. 매크로 다시 검색: 추가 매크로를 위해 결과 텍스트가 다시 검색됩니다. .

다음 단계를 적용하면 xstr(foo):

  1. str(s)에 # 또는 ##이 포함되어 있지 않으므로 아무 일도 일어나지 않습니다.
  2. foo는 4로 대체되어 xstr(4)가 됩니다.
  3. str(s) 내에서 s는 4로 대체되어 str(4)를 생성합니다.
  4. str(4)는 다음과 같습니다. 다시 스캔하여 "4"의 최종 출력을 생성합니다.

이제 str(foo)를 살펴보겠습니다.

  1. 인수 foo는 여전히 foo입니다(4로 대체되지 않음). .
  2. 대체 텍스트 #s는 다음을 생성합니다. "foo."

문제의 핵심은 실행 순서에 있습니다. 1단계에서 str(foo)가 평가될 때 foo는 아직 4로 대체되지 않았습니다. 따라서 문자열화 단계의 결과는 "foo"입니다.

따라서 xstr과 같은 도우미 매크로를 사용하면 다음이 가능합니다. 2단계와 1단계를 별도로 실행하여 궁극적으로 원하는 문자열화 동작을 제공합니다.

위 내용은 문자열화가 한 경우에는 'foo'를 생성하고 다른 경우에는 '4'를 생성하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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