일부 매크로 정의를 네임 스페이스에 사용하면 네임 스페이스 외부에서 작동해야하는 이유는 무엇입니까? 다음 코드를 확인하십시오 :왜 C++ 네임 스페이스 내부의 정의가 네임 스페이스 외부에서 작동합니까?
#include <bits/stdc++.h>
namespace foo {
#define a x*2
int f(int x) {
return a;
}
}
int main() {
int a = 50;
std::cout << a << endl;
std::cout << foo::f(4) << endl;
return 0;
}
여기 네임 스페이스 foo를 사용하여 작성한 적이 없습니다. 하지만 int를 선언하려고하면 이전에 정의 된대로 방해를 받기 때문에 여전히이 코드는 컴파일되지 않습니다. 그러나 이것이 왜 일어나야 하는가?
re "또는 다른 C++ 언어 구문"으로 사용하기 위해 '# if'조건으로 사용하기 위해 전처리 기는 C 표현식의 하위 집합을 지원합니다. 이러한 표현에는 C++의'false' 및'true' 리터럴은 포함되지 않습니다. 실전 테스트를 위해 g ++가이를 수용하지만 Visual C++은이를 수용하지 않습니다. –
이 답변은 정확합니다. 그러나 용어를 확장하고 싶습니다. 선행 처리 단계는 구문 분석 전에 발생하며 기술적으로 특수 언어를 처리합니다. IE의 모든 지시문 (예 :'#include ')이 확장 된 후 결과 처리 된 소스가 파싱되고 AST (추상 소스 트리)가 생성됩니다. 'gcc -E'를 호출하여 사전 처리 된 출력을 덤프 할 수 있습니다. –
@os_ IMHO는 충분히 명확합니다 (적어도 받아 들여졌습니다). 개선하기 위해 편집하려고 할 수 있습니다. –