刚开始使用K & R
,在第2章中,有一行:
声明列出要变量的变量 使用和陈述他们有什么类型和 可能是他们的初始值。
所以:
int x = 42
是定义。
和int x
是声明,但也是定义,因为每个定义都是声明
但是当我们分配一个像K & R
这样的初始值时,是不是会使声明成为定义?
答案 0 :(得分:2)
你混淆了两件事:
*对象如:变量,函数等,而不是OOP对象。
因此,定义通常也是一个声明,因为当您没有说明对象的类型是什么时,您无法定义对象中的内容。最容易记住的只是:“每个定义都是一个声明,但不是每个声明都是一个定义”
对于变量
在没有定义变量的情况下声明只有一种方法:
extern typeX variable_name
这告诉编译器有一个名为variable_name的变量,其类型为typeX,但不是从哪里获取它。 声明变量的每种其他方式也是一个定义,因为它告诉编译器为它保留空间并且可能给它一个初始值。
结构和功能的区别更加清晰:
对于Structs
声明:
struct some_struct{
int a;
int b;
}
这将使用a和b作为结构变量向编译器声明some_struct,类型为int。
只有在您定义空间时,才会保留空间,您可以使用它们:
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();
定义可能与上面的定义相似(在结构部分中)
答案 1 :(得分:1)
基本上你可以说声明只是告诉编译器某个变量具有该名称和类型。它确实生成任何代码,而在C中,必须使用变量上的extern
关键字来完成。函数原型(没有实现)也只是声明,不需要extern
关键字,但您仍然可以提供它。
定义产生代码,例如在堆栈或堆上为变量或方法的主体分配内存。
从这个意义上讲,你的两个定义都是定义,任何定义也都是定义。
我认为这可能是K& R的错误......