【问题标题】:Is my understanding of declaration and definition correct?我对声明和定义的理解正确吗?
【发布时间】:2017-03-02 04:36:54
【问题描述】:

根据你说的我的理解;

int var;          // it is a declaration because no value stored in var

但是当你这样做的时候;

int var = 90;     // it is a definition because var got its value

问这个问题的原因是我正在关注书籍和互联网进行编程。但是,我到处看到定义和声明的不同含义。请澄清一下,如果你知道得更好?

有人说两者都是定义,如果这是为什么下面的程序在 gcc 中给出“重新声明错误”而不是“重新定义错误”的情况。

int main(){
  int var = 100;
  int var;

  return 0;
}

编译时出错:

【问题讨论】:

  • 不,你的理解有误。两者都是定义,一个带有初始化器,一个没有。另见:en.cppreference.com/w/cpp/language/definition
  • @SurajJain,它们都是声明,但它们也是定义。两者并不相互排斥。
  • 正确的完整答案在 C 和 C++ 之间有所不同。你想要哪个一个
  • @chux 我想要C相关的答案
  • int var; 后跟 extern int var; 在文件范围内不是定义。

标签: c declaration multiple-definition-error


【解决方案1】:

它声明或定义的天气都取决于你在哪里使用它。天气它是同一程序的全局变量或其他程序的外部变量。 案例一

int var; 
main ()

行 int var;声明和定义变量;它实际上是说,“创建一个名为 var,类型为 int 的变量。此外,该变量的存储是它是在与此源文件关联的目标文件中定义的全局变量 .

案例2

extern int var;
main()

但这里是声明变量而不是定义它。所以这一切都取决于你在哪里使用这个

【讨论】:

  • int var; 不是一个定义。这是一个“暂定定义”,这意味着它可能毕竟不是定义..
  • @AnttiHaapala 暂定定义是一个定义。 “暂定”是形容词
【解决方案2】:

在函数内部,int var;int var = 90; 都是定义。由于在同一范围内有两个 var 定义,您会收到编译错误。请注意,它们也是声明(所有定义都是声明)。

相同的语法在函数之外有不同的含义,这可能就是你感到困惑的原因。

【讨论】:

    【解决方案3】:

    不,你对声明和定义的理解是错误的。

    线

    int var;
    

    是一个声明。它也可能是取决于上下文的定义(因为所有定义都是声明)。例如,在;

    int var;
    int main()
    {
    
    }
    

    var 的声明是具有外部链接的变量var暂定定义。在上面的上下文中,它实际上是一个定义。但是,如果我们将代码修改为;

    int var = 42;
    int var;
    
    int main()
    {
    
    }
    

    然后int var = 42 是一个带有初始化器的定义(42),下面的暂定定义int var 成为声明而不是定义。如果两行 int varint var = 42 互换也是如此。

    更妙的是,如果将int var 放在函数中,则含义会发生变化。例如;

    int main()
    {
        int var;
    }
    

    在此上下文中,int var 是自动存储持续时间变量var 的定义。在同一范围内放置var 的第二个定义是非法的。

    int main()
    {
        int var;          /* definition */
        int var = 42;     /*  second definition - illegal */
    }
    

    【讨论】:

      猜你喜欢
      • 2012-01-27
      • 2021-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多