文档章节

C语言中声明和定义的区别

JlongTian
 JlongTian
发布于 2017/01/05 09:02
字数 483
阅读 6
收藏 0

声明(declaration )指定了一个变量的标识符,用来描述变量的类型,是类型还是对象,或者函数等。声明,用于编译器(compiler)识别变量名所引用的实体。以下这些就是声明:

extern int bar;

extern int time(int, int);

double plus(int, double); // 对于函数声明,extern关键字是可以省略的。

定义是对声明的实现或者实例化。连接器(linker)需要它(定义)来引用内存实体。与上面的声明相应的定义如下:

int bar;

int time(int a, int b) {

   return a*b;
} 

double plus(int i, double d) {

   return i+d;

} 

无论如何,定义 操作是只能做一次的。如果你忘了定义一些你已经声明过的变量,或者在某些地方被引用到的变量,那么,连接器linker是不知道这些引用该连接到那块内存上的。然后就会报missing symbols 这样的错误。如果你定义变量超过一次,连接器是不知道把引用和哪块内存连接,然后就会报 duplicated symbols这样的错误了。以上的symbols其实就是指定义后的变量名,也就是其标识的内存块。

总结

如果只是为了给编译器提供引用标识,让编译器能够知道有这个引用,能用这个引用来引用某个实体(但没有为实体分配具体内存块的过程)是为声明。如果该操作能够为引用指定一块特定的内存,使得该引用能够在link阶段唯一正确地对应一块内存,这样的操作是为定义。

声明是为了让编译器正确处理对声明变量和函数的引用。定义是一个给变量分配内存的过程,或者是说明一个函数具体干什么用。

本文转载自:http://jingyan.baidu.com/article/020278118e51e01bcd9ce576.html

共有 人打赏支持
JlongTian
粉丝 3
博文 308
码字总数 148393
作品 0
深圳
程序员
私信 提问
C++ 的常见问题和解答[不断更新]

Q1: delete[] 和delete的区别 Q2:析构函数怎么写, 什么时候要用虚的析构函数 Q2:类对象的生命周期(构造和析构的先后顺序) Q4:预定义系列 Q5:typedef系列 Q6:优先级和结合顺序 Q7:复杂函数的指...

晨曦之光
2012/03/09
102
0
C++中头文件、源文件之间的区别与联系

.h头文件和.cpp文件的区别 疑惑1:.h文件能够编写main函数吗? 实验: 编写test.h文件,里面包含main函数 若直接编译g++ test.h -o test,通过file命令 file test,得到如下结果test: GCC p...

风筝Fergus
2013/04/17
0
2
解决报错:method “***” not supported by automation object

我遇到这个问题是在delphi6当中,服务端使用了RemoteDataModule模块,客户端使用TSocketConnection和TWebConnection来连接服务端,并且使用服务端定义的method(即function)。出现的问题是,...

shs0708
2016/08/04
464
0
extern用法详解(转)

基本解释 extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。 另外,extern也可用来进行链接指定。 2 问题:ext...

长征2号
2017/09/12
0
0
《从零开始学Swift》学习笔记(Day 8)——小小常量、变量大作用

原创文章,欢迎转载。转载请注明:关东升的博客 计算机语言学习中都有常量和变量,他们几乎是我编写代码的灵魂了,离开他们我真的是“活不了” 常量是标识符的前面加上关键字let。常量其值在...

智捷课堂
2015/08/31
50
0

没有更多内容

加载失败,请刷新页面

加载更多

Java单例模式学习记录

在项目开发中经常能遇见的设计模式就是单例模式了,而实现的方式最常见的有两种:饿汉和饱汉(懒汉)。由于日常接触较多而研究的不够深入,导致面试的时候被询问到后有点没底,这里记录一下学习...

JerryLin123
昨天
3
0
VSCODE 无法调试

VSCODE 无法调试 可以运行 可能的原因: GCC 的参数忘了加 -g

shzwork
昨天
4
0
理解去中心化 稳定币 DAI

随着摩根大通推出JPM Coin 稳定币,可以预见稳定币将成为区块链落地的一大助推器。 坦白来讲,对于一个程序员的我来讲(不懂一点专业经济和金融),理解DAI的机制,真的有一点复杂。耐心看完...

Tiny熊
昨天
4
0
5.线程实现

用于线程实现的Python模块 Python线程有时称为轻量级进程,因为线程比进程占用的内存少得多。 线程允许一次执行多个任务。 在Python中,以下两个模块在一个程序中实现线程 - _thread 模块 th...

Eappo_Geng
昨天
6
0
ServiceLoader

创建一个接口文件在resources资源目录下创建META-INF/services文件夹在services文件夹中创建文件,以接口全名命名创建接口实现类 内容me.zzp.ar.d.PostgreSQLDialectme.zzp.ar.d.Hype...

Cobbage
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部