source

Stringization - 어떻게 작동합니까?

goodcode 2022. 8. 20. 19:00
반응형

Stringization - 어떻게 작동합니까?

알고 있습니다.

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

와 함께str(foo)기입 내용:"foo"stringify는 텍스트 확장에서 먼저 실행되지만, 이는 다음과 같습니다.

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

와 함께xstr(foo)기입 내용:"4".

왜요? 그 과정에는 어떤 단계가 포함되어 있나요?

매크로 확장의 관련 단계는 다음과 같습니다(C 2011 [n1570] 6.10.3.1 및 C++ 1998 16.3.1에 따름).

  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)2단계는 2단계입니다.foo와 함께4는 스텝 1 뒤에 옵니다.이 스텝1에 의해 인수가 문자열로 변경됩니다.1단계에서는foo정지해 있다foo; 로 대체되지 않았습니다.4그 결과,”foo”.

이것이 도우미 매크로가 사용되는 이유입니다.스텝 2를 실행한 후 다른 매크로를 사용하여 스텝1을 실행할 수 있습니다.

첫 번째 케이스

  1. 평가하다str(foo): 대용품str(foo)와 함께#foo(즉,"foo"

두 번째 케이스

  1. 평가하다xstr(foo): 대용품xstr(foo)와 함께str(<foo-value>)(즉,str(4)
  2. 평가하다str(4): 대용품str(4)와 함께#4(즉,"4"

일반적으로.

preprocessor 에서는 평가 대상이 되지 않을 까지 매크로 패리티 확장 매크로 패리티를 평가합니다.

정의하면

#define xstr(s) str(s) + 1
#define str(s) s + 1

다음 암호로

#define foo 4

int main()
{
    std::cout << str(foo) << '\n' 
              << xstr(foo) << '\n' ;

} 

그것은 다음과 같이 평가될 것이다.

첫 번째 문자열

  1. 대체물str(foo)와 함께<foo-value> + 1(즉,4 + 1
  2. 더 이상 대체할 것이 없다.마무리.

그리고 결과는 4+1이다.

두 번째 문자열

  1. 대체물xstr(foo)와 함께str(<foo-value>) + 1(즉,str(4) + 1
  2. 대체물str(4)와 함께<4-value> + 1(즉,4 + 1
  3. 더 이상 대체할 것이 없다.

그리고 결과는 4+1+1이다.

언급URL : https://stackoverflow.com/questions/16989730/stringification-how-does-it-work

반응형