【问题标题】:const in C vs const in C++C 中的 const 与 C++ 中的 const
【发布时间】:2011-05-22 11:49:14
【问题描述】:

给定的代码在 C 中编译,但在 C++ 中失败。

int main()
{
   const int x; /* uninitialized const compiles in C but fails in C++*/
}

从 C 到 C++ 的转变背后的基本原理和原因是什么?

【问题讨论】:

    标签: c++ c constants


    【解决方案1】:

    请参阅兼容性附录 C.1.6 中的规范:

    7.1.6 [另见 3.5]

    更改: const 对象必须在 C++ 中初始化,但可以在 C 中保持未初始化状态

    基本原理:一个 const 对象不能被赋值,所以它必须被初始化以保存一个有用的值。

    对原始特征的影响:删除语义明确的特征。

    转换难度:语义转换。

    应用的广泛程度:很少。

    【讨论】:

    • 一个 const 对象可以在 C 中赋值吗?
    • @Sergii 我不这么认为。并且只有文件范围定义可以在 C 中是暂定的。所以我认为 C 程序无法为 const 块范围变量提供值。
    • @JohannesSchaub-litb C(或 C++)程序可以使用强制转换为 const 变量提供值:const int i; *((int*)&
    • @Yury 它不能。那是未定义的行为。
    【解决方案2】:

    请注意,自动存储持续时间的未初始化、 const 限定对象的合法使用:它的地址可以用作标记递归函数中递归级别的唯一键。这有点晦涩,但值得注意。 C 使这种使用变得高效,而 C++ 则需要您在初始化它时浪费时间和代码大小。 (理论上,编译器可能会确定该值从未被使用并优化初始化,但由于您传递的是指针,因此很难证明。)

    【讨论】:

    • 您还可以想象这样一种情况,您使用外部魔法(例如链接器,或在完成的二进制文件上)使健全的内容出现在这样一个变量中,即您不想要的内容中(或者可能不能)表达为 C 源代码。
    • 如果它有自动存储,链接器就不可能引入它;每个函数调用都有一个实例,而不是全局的。并且一旦在源代码级别存在 UB(来自访问未初始化对象的不确定值),编译器可能已经在链接器看到它之前生成了随机无意义的代码。
    • 没错,我没看到“自动”。
    【解决方案3】:

    const 关键字于 1989 年在 C89 中引入 C,但自 1983 年创建以来一直与 C++ 一起使用。因此它从 C++“向后移植”到 C。

    初始化语义在 C 和 C++ 中通常是不同的。尽管大多数时候他们“只是做你期望的事情”,但在某些情况下差异变得非常重要。毕竟,C++ 真的不是 C 的超集。

    例如,在 C++ 中你不能:

    goto x;
    int i = 3;
    x:
    puts("Hello, world");
    

    但这在 C 中是完全合法的。

    【讨论】:

    • 不会投反对票,因为它很有趣(而且正确),但它并不能完全回答问题。
    【解决方案4】:

    ISO 标准说(在 8.5 [dcl.init] paragraph 9):

    如果没有为对象指定初始化器,并且该对象属于 (可能是 cv 限定的)非 POD 类类型(或其数组), 对象应默认初始化;如果对象是 const 限定类型,基础类类型应具有 用户声明的默认构造函数。

    如果你在修改后尝试相同的示例:

    int main()
    {
       /*Unless explicitly declared extern, a const object does not have
     external linkage and must be initialized*/
       extern const int x; 
       return 0;
    }
    

    它将被编译。所以这个self解释了需要对c++强制执行这个错误,声明const vars而不初始化和extern links是没有用的,所以coder肯定是加错了。

    【讨论】:

      【解决方案5】:
      #include<iostream>
      using namespace std;
      
      class Test
      {
          int value;
          public:
              Test(int v = 0) {value = v;}
              int getvalue() const {return value;}
      };
      
      int main(){
      
          Test t(20);
          cout << t.getvalue();
          return 0;
           
          const double P1 = 68.68;
          cout<<P1<<endl;
          
          int star  = 57;
          int const *pstar = &star;
          cout<<*pstar<<endl;
          
          return 0;
          
      }
      

      【讨论】:

      • 这如何解释 C 和 C++ 之间的区别?
      猜你喜欢
      • 1970-01-01
      • 2014-05-12
      • 1970-01-01
      • 2020-01-09
      • 2012-02-13
      • 1970-01-01
      • 2010-09-14
      • 2014-03-23
      • 2011-11-10
      相关资源
      最近更新 更多