【问题标题】:Goal of C's "auto" keywordC 的“auto”关键字的目标
【发布时间】:2011-02-20 07:16:39
【问题描述】:

C 中“auto”关键字的目标是什么?对于 C++ 0x,它有了新的含义,但这是否意味着如果我将 C 代码移植到 C++ 0x 编译器,我的代码会中断?

【问题讨论】:

    标签: c++ c c++11


    【解决方案1】:

    如果您的代码包含auto 关键字,它将中断。在近 30 年的 C 和 C++ 编程中,我从未遇到过这样的情况。在第一个 C 编译器中引入了关键字来指定局部函数变量,但编译器几乎立即变得足够聪明,不需要它,并且使用它的代码很少能在今天继续存在 - 这就是 C++0x 选择回收它而不是引入一个导致可移植性问题的新关键字。

    C++0X 中 auto 关键字的目的是让编译器在可能的情况下计算出变量的类型:

    vector <int> v;
    auto it = v.begin():
    

    编译器可以看到 v.begin() 必须返回 vector&lt;int&gt;::iterator,因此可以创建该类型的变量,从而节省大量的键盘输入或 typedef 创建。

    【讨论】:

    • 太棒了,我讨厌输入向量迭代器;)
    • 为什么会破坏包含auto的代码?旧的意思不是还有效吗?
    • @mottii 老实说,我不确定 - 编译器当然可以看到 auto int i; 在新意义上不是自动使用的,但我不确定标准是否需要它们这样做。
    • @Motti:它将破坏任何在旧含义中使用auto 的代码,除非它被用于隐含int 的情况。将auto 视为类型; int float 有效吗?那么auto floatauto int 都不是。但是,我上面所说的例外是,在经典 C 中,auto i = 0; 创建了一个自动分配的变量,其类型隐式为int,命名为i,初始化为0。这种情况恰好适用于新的含义。 (auto 将被推断为 int,因为初始化器的类型 0 是 int。)
    • @Motti 在 c++0x 模式下 g++ 的价值在于 auto int i 上的 barfs;
    【解决方案2】:

    在 C 中,auto 指定自动存储持续时间(与 staticexternregister 相对)。由于这是默认设置,我从未见过在任何代码中使用auto。不过,我没有做过太多的 C。

    【讨论】:

      【解决方案3】:

      很少使用;这意味着一个局部变量。现代编译器如 VS2010 C++ 给它一个new meaning

      【讨论】:

      • 这个新的含义来自上面提到的C++0x标准
      【解决方案4】:

      这个答案错了,见following question,我把答案留在这里作为参考。


      AFAIK C++0x 对 auto 的使用与 C 对 auto 的传统使用并不矛盾。在 C 中auto 与类型一起使用。

      auto char c1 = 'a'; // OK, old meaning of auto is still valid
      auto c2 = 'b'; // OK, new meaning of auto (deduce c2 is a char)
      

      它可以改变代码含义的唯一地方是当 auto 与 implicit int 规则一起使用时(如果没有指定类型 -> 它是一个 int)在这种情况下,我的示例中的第二行曾经具有 int 类型的 c2,现在它的类型为 char

      【讨论】:

      • 不使用 g++,FWIW 编译。
      • 谢谢@Neil,我问了一个新问题来找出谁是对的(我找不到任何 C++0x 草案)
      • 令我惊讶的是,考虑到 C++ 中的所有其他缺陷,为了 C 兼容性,他们不允许这样做。 ;)
      【解决方案5】:

      Bjarne Stroustrup 在他的C++0x FAQ 中提到了auto

      "auto 的旧含义("这是一个 局部变量") 是多余的并且 没用过。几名委员会成员 搜索了数百万行 只找到少数用途的代码—— 其中大部分都在测试套件中 或似乎是错误。”

      所以我假设,标准不会强制编译器实现auto 的旧含义。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-06-08
        • 2011-04-16
        • 2017-09-07
        • 2012-08-24
        • 2023-03-31
        • 2011-03-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多