반응형
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에 따름).
- 다음으로 이어지는 프로세스 토큰
#또는##. - 각 인수에 매크로 치환을 적용합니다.
- 각 파라미터를 위의 매크로 치환 결과에 따라 바꿉니다.
- 다른 매크로를 재스캔 합니다.
그 때문에,xstr(foo)이하가 있습니다.
- 대체 텍스트,
str(s), 를 포함하지 않습니다.#또는##그래서 아무 일도 일어나지 않는다. - 의론
foo로 대체되었습니다.4그래서 마치xstr(4)사용되었습니다. - 대체 텍스트에서
str(s)파라미터,s로 대체되었습니다.4, 생산.str(4). str(4)재스캔 됩니다.(결과적인 스텝에 의해”4”.)
에 관한 문제는str(foo)2단계는 2단계입니다.foo와 함께4는 스텝 1 뒤에 옵니다.이 스텝1에 의해 인수가 문자열로 변경됩니다.1단계에서는foo정지해 있다foo; 로 대체되지 않았습니다.4그 결과,”foo”.
이것이 도우미 매크로가 사용되는 이유입니다.스텝 2를 실행한 후 다른 매크로를 사용하여 스텝1을 실행할 수 있습니다.
첫 번째 케이스
- 평가하다
str(foo): 대용품str(foo)와 함께#foo(즉,"foo"
두 번째 케이스
- 평가하다
xstr(foo): 대용품xstr(foo)와 함께str(<foo-value>)(즉,str(4) - 평가하다
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' ;
}
그것은 다음과 같이 평가될 것이다.
첫 번째 문자열
- 대체물
str(foo)와 함께<foo-value> + 1(즉,4 + 1 - 더 이상 대체할 것이 없다.마무리.
그리고 결과는 4+1이다.
두 번째 문자열
- 대체물
xstr(foo)와 함께str(<foo-value>) + 1(즉,str(4) + 1 - 대체물
str(4)와 함께<4-value> + 1(즉,4 + 1 - 더 이상 대체할 것이 없다.
그리고 결과는 4+1+1이다.
언급URL : https://stackoverflow.com/questions/16989730/stringification-how-does-it-work
반응형
'source' 카테고리의 다른 글
| VueJ에서 마우스 좌표를 얻는 방법s (0) | 2022.08.20 |
|---|---|
| 파일이 nuxt에 있는지 확인하는 방법 (0) | 2022.08.20 |
| Android에서 다른 응용 프로그램에서 작업을 시작하는 방법 (0) | 2022.08.20 |
| C/C++에서의 어셈블리 언어 사용 (0) | 2022.08.19 |
| 경고:Assert 유형의 assertEquals 메서드는 더 이상 사용되지 않습니다. (0) | 2022.08.19 |