繁体   English   中英

具有值的变量的定义和声明

[英]Definition and declaration of variable with a value

刚从K & R开始,在第二章,有一行:

声明列出了要使用的变量并声明它们的类型和初始值

所以:

int x = 42是一个定义

int x是一个声明,但也是一个定义,因为每个定义都是一个声明

但是,当我们给K & R这样的初始值赋值时,这不是使声明成为定义吗?

您将两件事混淆了:

  1. 声明声明( 声明 )对象的*类型,名称和范围
  2. 定义定义对象的内容是什么

*对象如:变量,函数等,而不是OOP对象。

因此,定义通常也是声明,因为当您不声明对象的类型时,就无法定义对象中的内容。 最容易记住的是:“每个定义都是一个声明,但并非每个声明都是一个定义”

对于变量

没有定义变量的方法只有一种:

extern typeX variable_name

这告诉编译器存在一个类型为typeX的名为variable_name的变量,但没有在何处获取它。 声明变量的所有其他方法也是定义,因为它告诉编译器为其保留空间并可能给它提供初始值。

结构和功能上的差异更加明显:

对于结构

声明:

struct some_struct{
    int a;
    int b;
}

这会使用a和b作为均为int类型的结构变量向编译器声明some_struct。

只有在定义它们时,才保留空间并可以使用它们:

void foo(){
    struct some_struct s;
    s.a = 1; // For this to work s needs to be defined
}

对于功能

区别更加明显

宣言:

// This tells the compiler that there is a function called "foo" that returns void and takes void arguments
void foo();

定义可能类似于上面的定义(在struct部分中)

基本上可以说,声明只是告诉编译器某个地方存在具有该名称和类型的变量。 它确实可以生成任何代码,并且在C语言中,必须使用变量的extern关键字来完成。 函数原型(没有实现)也只是声明,不需要extern关键字,但是您仍然可以提供它。 定义产生代码,例如,在堆栈或堆上为变量分配内存,或为方法分配主体。

从这个意义上说,您的两个陈述都是定义,任何定义都是代名词。

我认为这可能是K&R的一个错误...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM