2010-06-29 3 views
3

<cstdint><tr1/cstdint>의 차이점은 무엇입니까? (그 외에는 네임 스페이스 std::에있는 것들과 다른 것들은 std::tr1::에 넣습니다.)cstdint와 tr1/cstdint의 차이점

이 것들은 표준이 아니기 때문에 컴파일러에 따라 다르므로 gcc에 관한 것입니다. non-tr1으로 컴파일하려면 -std=c++0x으로 컴파일해야하지만 tr1을 사용할 때는 이러한 제한이 없습니다.

아마도 대답이없는 것 같습니다.하지만, 표준을 제외하고는 std::에 물건을 추가 할 수는 없습니다. 따라서 C++ 0x가 표준화되기 전까지는 <cstdint>을 사용하여 오류를 발행해야하지만 tr1:: 네임 스페이스에 추가 할 때 걱정할 필요가 없습니다. 아니면 이것에 더 많은 것이 있습니까?

감사합니다.

p.s - 당신이 표준으로 "표준"을 읽으면 내가 할 것처럼, 나는이 Q.

답변

3

적어도 내가 아는 한, TR1과 C++ 0x 사이에는 <cstdint>을 변경할 의도가 없었습니다. #include을 입력하여 <cstdint>을 실행해도 오류는 발생하지 않습니다. 공식적으로는 정의되지 않은 동작보다 많거나 적습니다. 구현시 정확한 동작을 지정할 수 있으며이 경우에는 올바르게 수행됩니다.

+0

아, 죄송합니다. 컴파일러가'std ::'에 추가 할 때 오류가 발생했음을 암시하는 것을 의미하지는 않았지만, 그 말은 모호성을 없애기 위해 고맙습니다. 'std ::'에 추가하면 정의되지 않은 동작이 발생한다는 것을 의미합니까?나는 그것을 깨닫지 못했다. 단지 그것이 매우 나쁜 형태라고 생각했다. 알아 둘만한. 또한, 줄 사이에서 읽기, 나는 안전하게 TR1 헤더가 변경되지 않는다고 가정 할 수있는 반면 C++ 0x는 명백하게 (그리고 아마도 그렇게 할 것입니다). – tjm

+0

TR1 헤더는 그대로 있으며 변경되지 않습니다. 이 시점에서 나는 C++ 0x 헤더의 중대한 변화를보고 놀랄 것입니다. 그들은 이미 "최종위원회 초안"을 만들고 C++ 0x의 공식적인 코멘트 기간을 마감했습니다. 이 시점에서 대부분의 공식적인 주석에 답하고 문구에 대한 최종 정리 작업을 수행하지만 대부분 문서의 * 의도는 동일하게 유지되어야합니다. 실제로 문서의 의도를 실제로 확인해야합니다. 예정된. –

+0

정말 고맙습니다. – tjm

3

당신이 그것을 가지고 생각에 단어의 남용에 대해 사과 않습니다. 내 시스템에서는 매우 유사하지만 다른 매크로 논리를 사용합니다.

# define _GLIBCXX_BEGIN_NAMESPACE_TR1 namespace tr1 { 
# define _GLIBCXX_END_NAMESPACE_TR1 } 
# define _GLIBCXX_TR1 tr1:: 

을하지만/usr/include/c++/4.4/cstdint이있다 : 예를 들어, /usr/include/c++/4.4/tr1/cstdint이있는 TR1 네임 스페이스가 단순히 망각으로 정의된다 <cstdint>로 포함되고있어 경우에 따라서

# define _GLIBCXX_BEGIN_NAMESPACE_TR1 
# define _GLIBCXX_END_NAMESPACE_TR1 
# define _GLIBCXX_TR1 

.

+0

내가 그 때 예상했던대로. 확인해 주셔서 감사합니다. – tjm

2

<tr1/cstdint>TR1에 정의 된대로 <cstdint>c++0x으로 정의됩니다.

gcc 설명서에서 C++ 0x에 포함될 가능성이있는 실험 기능을 사용하려면 -std=c++0x이 필요합니다. 그러나 <tr1/cstdint>TR1이 아니라 c++0x이 아니므로 -std=c++0x은 필요하지 않습니다.

다음은 참조 용 -std=c++0x에 대한 gcc 매뉴얼입니다.

곧 나올 ISO C++ 0x 표준의 초안입니다. 이 옵션을 사용하면 C++ 0x에 포함 된 일 가능성이있는 실험 기능을 사용할 수 있습니다. 작업 초안이 계속 변경되고 있습니다 ( ).이 플래그로 활성화 된 기능은 C++ 0x 표준의 일부가 아닌 경우 GCC의 이후 버전에서 을 제거 할 수 있습니다.