C++ 표준을 사용하여 다음 매크로 정의를 어떻게 해석해야합니까? 주요 문제를 주목하면 오류없이 다음과 같이 AA
에 대한 그 교체 목록 (for, S
)우리는 어떻게 쉼표로 매크로를 해석해야합니까?
#define AA for, S //<---note the embedded comma
#define VALUE_TO_STRING(x) ^x!
#define VALUE(x) VALUE_TO_STRING(x)
int _tmain(int argc, _TCHAR* argv[])
{
VALUE(AA)
return 0;
}
내가 VC++ 2010 테스트하고, 상기 외관의 최종 결과를했던 임베디드 쉼표를 포함하지만, 나는 문제는 결과가 C++ 03 (또는 C++ 11) 표준 사용을 마련하기 위해 수행 한 단계 해석했습니다 :
int wmain(int argc, _TCHAR* argv[])
{
^for, S!
return 0;
}
내가 VC와 스텝 테스트로 몇 가지 단계를 완료했습니다를 ++ 2010. 우선 첫 번째 단계에서 무슨 일이 벌어지고 있는지 확인하기 위해 2 매크로에서 주석 : 매크로 교체가 똑바로 앞으로
#define AA for, S
//#define VALUE_TO_STRING(x) ^x!
#define VALUE(x) VALUE_TO_STRING(x)
입니다
및 두 개의 인수를 갖는 다른 함수와 같은 매크로처럼 보이는 일련의 산출 :int wmain(int argc, _TCHAR* argv[])
{
VALUE_TO_STRING(for, S)
return 0;
}
을
[cpp.rescan]에 따르면 다음 단계는 더 많은 매크로 이름을 위해 이것을 다시 스캔하는 것입니다. 여기에있는 질문은이 새로운 매크로가 2 개의 인수 또는 1 개의 인수 "for, S
"을 가진 함수와 같은 매크로로 해석되어야합니다.
정상적인 해석은 VALUE_TO_STRING()에 2 개의 인수가 주어 졌으므로 전 처리기 오류가 발생했다는 것을 고려해야합니다. 그러나 어떻게 VC++가 오류없이 결과를 내놓았 을까요? 분명히 VC++가 취한 두 번째 단계는 for, S
을 1 개의 단일 인수로 생각하는 것이 었습니다.이 인수는 의미가 없으며 C++ 표준에 의해 정의되지 않았습니다.
왜 downvote ??? – JavaMan
나는 downvote하지 않았다. 나는 지금 막이 질문을 upvoted, 내 생각에 꽤 어렵지만 명확하고 유용합니다. – Yunnosch
VC++에는 표준 준수 전 처리기가 없습니다. – rici