我对宣言和定义的理解是否正确?

时间:2017-03-02 04:36:55

标签: c declaration multiple-definition-error

根据我的理解,当你说;

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中给出“重新声明错误”而不是“redifination error”。

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

  return 0;
}

编译时出错:

enter image description here

3 个答案:

答案 0 :(得分:1)

它声明或定义的天气全部取决于您使用它的位置。天气它是同一程序的全局变量或其他程序的外部变量。 案例1

int var; 
main ()

行int var;都声明并定义变量;它有效地说,“创建一个名为var的变量,类型为int。此外,变量的存储是它是在与此源文件关联的目标文件中定义的全局变量

案例2

extern int var;
main()

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

答案 1 :(得分:0)

在函数内部,int var;int var = 90;都是定义。如果在同一范围内有两个var定义,则会出现编译错误。请注意,它们也是声明(所有定义都是声明)。

相同的语法在函数之外具有不同的含义,这可能是您混淆的原因。

答案 2 :(得分:0)

不,您对声明和定义的理解不正确。

该行

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 */
}