【问题标题】:error in c, but not in c++c中的错误,但在c ++中没有
【发布时间】:2010-06-17 11:48:38
【问题描述】:
const int t=5;
char buf[t+5];

当我编译时,这会在 C 中出现错误,但在 C++ 中不会出现!!
谁能解释一下原因?

注意:我知道 const 在“C++”中默认为内部链接,而在“C”中它默认为外部链接。和上面的案例有关系吗??

【问题讨论】:

    标签: c++ c compiler-errors


    【解决方案1】:

    这在 C89 C 中无效,但在 C99 中可能有效

    this stack overflow question

    【讨论】:

      【解决方案2】:

      正如其他人所解释的,C 比 C++ 更简单,并且不允许 const 变量出现在整数常量表达式中。但是在 C89 和 C++ 中声明的数组都必须具有编译时常量大小。

      您可以为此使用枚举

      enum {
        BufSize = 5
      };
      
      char buf[BufSize + 5];
      

      它与内部链接无关 - 外部链接变量在 C++ 的整数常量表达式中同样可行。 C++ 中的内部链接是允许它们出现在常量表达式中的结果,但不是必需的。 C++ 标准解释了为什么它们默认具有内部链接

      因为 const 对象可以在 C++ 中用作编译时值,所以这个特性促使程序员为每个 const 提供显式的初始化值。此功能允许用户将 const 对象放在许多编译单元中包含的头文件中

      【讨论】:

      • C99 允许可变大小的数组作为局部变量
      【解决方案3】:

      我认为这是因为编译器无法将 t+5 评估为常量表达式。看起来应该没问题,但是:

      关于数组声明的一个重要点是它们不允许使用不同的下标。给定的数字必须是可以在编译时计算的常量表达式,而不是运行时。

      Source

      【讨论】:

      • 't' 是 const 变量,因此编译器知道它的值在程序生命周期内是相同的。那么为什么它不能替换变量't'值并为buf分配内存。顺便说一句,内存何时分配给 buf??
      • @esh C 保持简单。它不需要编译器做任何更复杂的分析。
      【解决方案4】:

      在 C 中,数组的大小必须是常量表达式。 Const Int 在 C 中不是常量表达式。它的含义更像是“只读”。请改用#define t 5。

      【讨论】:

      • 为什么在 c++ 中没有给出错误?如果我从第一行删除 const,c++ 也会给出错误?编译器将在编译期间保留 t 的值(即 5),为什么它不能将此值用于 buf?
      【解决方案5】:

      是的,这与 C 对 t 的外部链接有关。

      您已经声明了一个外部链接的整数 t。如果将此文件与另一个定义 t 的文件链接,那么缓冲区的大小必须在文件的编译时间之后确定,这在 C 语言中当然是不可能的。

      【讨论】:

      • 对不起,我不得不给-1。它与链接没有任何关系。 extern const int t = 5; char buf[t + 5]; 在 C++ 中同样适用。
      • 我认为这与您不允许在 C 中使用动态数组这一事实有关,但 C++ 有一些功能
      【解决方案6】:

      这里有两个问题,动态大小的数组和常量。 const 的概念在 C 和 C++ 中是不同的。对于 C,它只是一个您无权更改的变量,因此对于仅允许具有编译时间固定维度的数组的 C 方言来说,它不是一个有效维度。 在 C 中定义“编译时间常数”的唯一方法是使用枚举类型

      枚举虚拟 { t=5 };

      所以这样的事情适用于 C89。

      与此相反,您的代码也应该在 C99 中工作。在那里,数组将在语法上被识别为动态大小。那么任何体面的优化器都应该能够优化它。 但也要注意 sizeof(buf) 将是 C++ 中数组 (10) 的总大小,而对于 c99,它将是 sizeof(char*)

      【讨论】:

      • 在 C99 中,sizeof(buf) 将在运行时进行评估并产生 10。 :)
      • 是的,你是对的,我认为 sizeof 应该始终在编译时确定。但似乎,仅仅使用动态大小的数组,这不再是真的了。啊。
      猜你喜欢
      • 2013-05-03
      • 2021-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-28
      • 1970-01-01
      • 2014-02-17
      • 1970-01-01
      相关资源
      最近更新 更多