사실에서 추가 매개 변수 브래킷 CAT(M_, a)
주의로 정의되는 반면, 매크로는 N(a) CAT(N_,a)()
있다 , 그것은 언어 표준에 대한 귀하의 해석에 달려 있습니다. 예를 들어, MCPP 하에서 엄격 언어 표준 텍스트 따르는 전처리 구현은, 제 수율 CAT(x, y);
뿐만 [추가 바꿈이 결과로부터 제거되었다]
가
C:\dev>mcpp -W0 stubby.cpp
#line 1 "C:/dev/stubby.cpp"
CAT(x, y) ;
CAT(x, y) ;
C:\dev>
의 C a known inconsistency있다 ++ 언어 명세 (결함 목록이 C를위한 곳이 어디인지는 알 수 없지만 C 사양에는 동일한 불일치가있다.) 사양은 최종 CAT(x, y)
매크로 대체 할 수 없습니다. 그 의도는 매크로 대체되어야한다는 의도 일 수도 있습니다. 그것이 "비 교체"말씨와 의사 코드를 생성 할 수있는 시도 사이의 작은 차이가 있다고 여러 WG14 사람들에 의해 이해 된 1980 년대로 돌아 가기
:
링크 된 결함 보고서를 인용합니다.
"야생에서"현실적인 프로그램이이 지역을 탐험 할 의사가 없으며 불확실성을 줄이려는 시도가 구현이나 프로그램의 적합성 상태를 변경할 위험이 없다는 것이위원회의 결정이었습니다. 그래서
, 왜 우리는 가장 일반적인 처리기 구현과 N(0)
보다 M(0)
에 대한 다른 동작을받을 수 있나요? M
교체에서 CAT
번째 호출이 CAT
의 최초 호출에 의한 토큰의 전체로 구성 대신 CAT(M, 0)
으로 대체 할 정의
M(0)
CAT(M_, 0)
CAT_I(M_, 0)
M_0
CAT(x, y)
M_0
경우, 여분 무한 재귀 것이다. 전 처리기 사양은 명시 적으로 매크로 교체를 중지하여이 "엄격하게 재귀"대체를 금지하므로 CAT(x, y)
매크로가 대체되지 않습니다. CAT
번째 호출이 토큰으로부터 부분적으로 형성되고, 여기
N(0)
CAT(N_, 0) ()
CAT_I(N_, 0) ()
N_0 ()
CAT(x, y)
CAT_I(x, y)
xy
:
그러나 N
의 교체에 CAT
번째 호출 CAT
의 제 호출 따른 토큰 부분적 이루어져 CAT
의 첫 번째 호출과 부분적으로 다른 토큰 인 의 ()
의 호출로 인한 결과입니다. 대체는 엄격히 재귀 적이 아니므로 두 번째 호출 CAT
이 대체되면 무한 재귀를 생성 할 수 없습니다.
1 :
어 ... 여기 정확히 달성하려는 것은 무엇입니까 ... 그리고 어떤 목적으로? – t0mm13b
나는 무엇인가를 이루고 싶지 않고, 뭔가를 할 때 이것을 알아 차렸고 그 이유에 대해 궁금합니다. 그것은 내가 이해할 수 없을 때 나를 귀찮게한다. :). – imre