【问题标题】:difference between cstdint and tr1/cstdintcstdint 和 tr1/cstdint 的区别
【发布时间】:2010-06-29 01:51:40
【问题描述】:

<cstdint><tr1/cstdint> 有什么区别? (除了一个把东西放在命名空间std::,另一个放在std::tr1::

由于这些东西还不是标准的,我猜它是特定于编译器的,所以我说的是 gcc。用非tr1编译我必须用-std=c++0x编译,但是使用tr1时没有这个限制。

答案可能是没有,但你不能到处添加东西到std::,除非有,好吧,标准。因此,在 c++0x 标准化之前,必须使用 <cstdint> 发出错误,但在添加到 tr1:: 命名空间时您不必担心,这并没有声称其中的东西是标准的?还是还有更多?

谢谢。

p.s - 如果您像我一样将“std”作为标准阅读,我为在此 Q 中过度使用该词表示歉意。

【问题讨论】:

    标签: c++ c++11 tr1


    【解决方案1】:

    至少据我所知,没有打算在 TR1 和 C++0x 之间更改 <cstdint>。不过,#includeing <cstdint> 不需要导致错误——正式地说,它只不过是未定义的行为。允许实现指定确切的行为,在这种情况下它确实如此。

    【讨论】:

    • 啊,是的,对不起,并不是说编译器在添加到std:: 时会出错,但这就是我所说的,不是吗,谢谢你清理歧义。你的意思是添加到std:: 会导致未定义的行为吗?我没有意识到这一点,只是认为这是非常糟糕的形式。很高兴知道。另外,从字里行间看,我可以安全地假设 TR1 标头现在不会更改,而 C++0x 的标头显然可以(而且很可能会)。
    • TR1 标头就是它们的本来面目,不会改变。在这一点上,我会很惊讶地看到 C++0x 标头中的任何重大变化——他们已经产生了“最终委员会草案”并关闭了 C++0x 的官方评论期,所以在这一点上,主要是回答所有官方 cmets,并对措辞进行最后的清理,但在大多数情况下,文档的 intent 应该保持不变——这只是制作的问题确保它确实说明了预期。
    【解决方案2】:

    我想你已经明白了。在我的系统上,它们非常相似,但具有不同的宏观逻辑。例如,/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 命名空间被简单地定义为 oblivion。

    【讨论】:

    • 非常感谢,正如我当时所期望的那样。很高兴得到确认。
    【解决方案3】:

    <tr1/cstdint> 顾名思义是在TR1 中定义的,而<cstdint> 是在c++0x 中定义的。

    从 gcc 手册中,需要-std=c++0x 来启用可能包含在 C++0x 中的实验性功能。但是,<tr1/cstdint> 是在 TR1 中定义的,而不是 c++0x,因此不需要 -std=c++0x

    以下是-std=c++0x的gcc手册供大家参考。

    即将发布的 ISO C++0x 标准的工作草案。这 选项启用可能会出现的实验性功能 包含在 C++0x 中。工作草案不断变化, 并且可以删除此标志启用的任何功能 如果它不是 C++0x 的一部分,则来自 GCC 的未来版本 标准。

    【讨论】:

      猜你喜欢
      • 2012-11-18
      • 2015-03-05
      • 2014-07-02
      • 2020-05-23
      • 2015-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多