[英]Definition and declaration of variable with a value
刚从K & R
开始,在第二章,有一行:
声明列出了要使用的变量并声明它们的类型和初始值 。
所以:
int x = 42
是一个定义 。
int x
是一个声明,但也是一个定义,因为每个定义都是一个声明 。
但是,当我们给K & R
这样的初始值赋值时,这不是使声明成为定义吗?
您将两件事混淆了:
*对象如:变量,函数等,而不是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.