разница между cstdint и tr1 / cstdint - PullRequest
3 голосов
/ 29 июня 2010

В чем разница между <cstdint> и <tr1/cstdint>? (кроме этого один помещает вещи в пространство имен std::, а другой в std::tr1::)

Так как этот материал не является стандартным, я думаю, что он зависит от компилятора, поэтому я говорю о gcc. Чтобы скомпилировать не-tr1, я должен скомпилировать с -std=c++0x, но при использовании tr1 такого ограничения нет.

Возможно, ответ заключается в том, что его нет, но вы не можете добавлять что-то к std::, если нет, ну, в общем, стандарта. Таким образом, до тех пор, пока c ++ 0x не будет стандартизирован, необходимо выдавать ошибку, используя <cstdint>, но вам не нужно беспокоиться при добавлении в пространство имен tr1::, что не претендует на то, чтобы в нем было что-то стандартное? Или есть что-то еще?

Спасибо.

p.s - Если вы читаете «std» как стандарт, как я, я прошу прощения за злоупотребление словом в этом вопросе.

Ответы [ 3 ]

3 голосов
/ 29 июня 2010

По крайней мере, насколько я знаю, не было никакого намерения менять <cstdint> между TR1 и C ++ 0x.Нет никакого требования для #include ing <cstdint>, чтобы привести к ошибке, хотя официально, это не что иное, как неопределенное поведение.Реализация может указывать точное поведение, и в этом случае это так.

3 голосов
/ 29 июня 2010

Я думаю, что вы поняли.В моей системе они очень похожи, но с другой макро-логикой.Например, /usr/include/c++/4.4/tr1/cstdint имеет:

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

, но / usr/include/c++/4.4/cstdint имеет:

#  define _GLIBCXX_BEGIN_NAMESPACE_TR1
#  define _GLIBCXX_END_NAMESPACE_TR1
#  define _GLIBCXX_TR1

Так что, если он включен как <cstdint>, пространство имен TR1 просто определяется как забвение.

2 голосов
/ 29 июня 2010

<tr1/cstdint> определяется, как следует из названия, в TR1 , а <cstdint> определяется в c ++ 0x .

Из руководства по gcc, -std=c++0x необходим для включения экспериментальных функций, которые, вероятно, будут включены в C ++ 0x. Однако <tr1/cstdint> определяется в TR1 , а не c ++ 0x , поэтому -std=c++0x не требуется.

Ниже приводится руководство по gcc для -std=c++0x для справки.

Рабочий проект будущего стандарта ISO C ++ 0x. это опция включает экспериментальные функции, которые могут быть включен в C ++ 0x. Рабочий проект постоянно меняется, и любая функция, включенная этим флагом, может быть удалена из будущих версий GCC, если он не является частью C ++ 0x стандарт.

...