C/C++中的声明与定义
含义
声明(Declaration), 用于告诉编译器被声明的函数/变量的存在, 及它们的类型/调用格式信息, 以检查是否被正确调用. 声明不分配内存空间.
定义(Definition), 用于告诉编译器被声明的函数/变量的存在位置, 会分配内存空间.
变量/函数在被使用之前一定要被声明. 声明和定义可以同时进行.
可以有多个声明, 但只能有一个定义.
函数的声明与定义
函数的Declaration由函数的签名(函数名+参数列表)与return类型, 外加一个分号组成. 如:
void fn(int a);
定义则有函数实体:
void fn(int a)
{
printf("%d\n", a);
}
C与C++的声明有一个不同之处:
void fn();
不带参的声明在C里代表可以传入任何参数, 而在C++中则代表不传入任何参数.
例如下面这段代码:
#include <stdio.h>
void fn();
int main()
{
printf("Hello World!\n");
fn(1);
}
void fn(int a)
{
printf("%d\n", a);
}
在C语言中, 它可以通过编译并执行, 但在C++中则不行.
若函数第一次出现时就定义了函数体, 则代表声明与定义同时进行.
变量的声明与定义
大多同时进行. 也可以用关键字extern来告诉编译器, 这仅仅是个声明:
int a; //声明与定义同时进行
extern int b; //只有声明, 定义不在此处.
其它语言中的类似语法
- Java中的
abstract方法及interface, 很纯粹的declaration. - Python中的
global关键字与extern作用类似.
C/C++中的声明与定义的更多相关文章
- PHP中变量声明和定义的区别
先记录一下(不知道PHP是不是一样,但是C语言是这样的):把建立空间的声明称之为“定义”,而把不需要建立存储空间的声明称之为“声明”.声明的最终目的是为了提前使用,即在定义之前使用,如果不需要提前使用 ...
- C++中的声明与定义
转自:http://www.cnblogs.com/kingcat/archive/2011/12/30/2307426.html C++是一种复杂的计算机语言,很多在现代高级语言中已经不需要程序员操 ...
- C语言中的声明与定义的差别
1.对于以下的声明语句 int a; 假设其位置出如今全部的函数体之外,那么它就被称为外部对象a的定义.这个语句说明了a是一个外部整型变量,同一时候为a分配了存储空间.由于外部对象a并没 ...
- C++中复杂声明和定义的辨析
0x00 前言 c++中的复杂声明往往令人无法下手,经常使人搞错这到底声明的是一个指针还是指针函数.但其实c++对于复杂声明是遵循一定的规则的,叫做变量名—>右--左-右规则. 0x01 规则解 ...
- 在源文件(.c)和头文件(.h)中声明和定义的区别——C语言
最近在看多文件编程的时候遇到的一个问题,本来以为理解了声明和定义的区别(然而并没有····),也算是重新认识了一次声明和定义,下面上代码 情形一:在源文件(.c)中 相信大部分读者对声明和定义的理解是 ...
- 浅谈声明与定义的区别 分类: C/C++ 2015-06-01 15:08 157人阅读 评论(4) 收藏
以下代码使用平台是VS2012. 清楚明白声明与定义是一名合格的程序猿的基本要求. 本人认为,C++编码过程中谈及"声明"和"定义"是因为我们要使用一个变量.类 ...
- switch语句下的变量声明和定义
switch语句下的变量声明和定义的问题: switch...case...语句中存在声明和定义会出现一些问题.这个由switch语法特性决定的, switch中每个case都是平等的层次,区别于一般 ...
- 声明、定义 in C++
序 声明和定义是我们使用的基础,但是对于声明和定义的概念,我们不甚了了,也就是说感觉好像是这样,但是真要详细说明就说不上来. 有博主对于声明和定义有以下描述: 1.需要建立存储空间的 ...
- 【转】变量的声明和定义,从C到编译原理到C++,再到Java
基础学了太久,时间一长有些东西就可能记得不太清楚,俗话说得好,"好记性不如烂笔头",所以把基础中的基础-变量的声明和定义,从C到编译原理到C++,再到Java用烂笔头记录下来 最早 ...
随机推荐
- MAC下的XMPP环境搭建
实现即时通信有多种方式,下面讲的是Mac下使用XMPP来实现. XML Messages Presence Protocol 可扩展消息处理协议 简单讲就是基于XML语言的点对点即时通信协议 原理: ...
- xCode5 在ios7模拟器中出现__cxa_throw _pthread_exit错误
xCode5 在ios7模拟器中出现__cxa_throw _pthread_exit错误 2013年10月28日 ⁄ 综合 ⁄ 共 233字 ⁄ 字号 小 中 大 ⁄ 评论关闭 在项目中用模拟器 ...
- linux 学习随笔-系统日常管理常用命令
1:W 查看系统整体负载,无法查看具体负载,比如内存,磁盘 23:25:20 up 13 min, 2 users, load average: 0.00, 0.01, 0.01 USER ...
- 此实现不是 Windows 平台 FIPS 验证的加密算法的一部分的解决办法方案
最近操作系统不断地报异常或错误,可能是用得太久了,而刚好工作比较多又不想重新安装系统,但用一段时间后(一天大概有两次)系统就出现各种问题导致无法继续使用真是痛苦万分啊,今天又来了这样的错误: 此实现不 ...
- SSIS 2010 BUG 一例
Sample data :abc|"edfg|xyz Test 1: Text Qualified is set to nothing. the result is in good for ...
- ORACLE 11g 数据库体系结构图
ORACLE 11g 的数据库体系结构图,非常全面.系统.高屋建瓴的整体介绍了ORACLE 11g 的数据库体系结构.如果能全面了解.清晰梳理.深入掌握这些知识点,相信对你了解学习.深入研究ORACL ...
- crontab设置作业间隔执行问题
这个源于有个网友问,crontab里 */40 9 * * * 是不是代表9点开始每40分钟执行? 直觉这个肯定不是从9:00开始每隔40分钟执行一次,但是也不能肯定它代表一个什么样的 ...
- 解决MyEclipse中的js报错的小方法
今天,下了个模版,但是导进去的时候发现js会报错.看了下其他都没有错误.而有一个js报错误,请原谅我有点红色强迫症,不能留一点红色 . 错误如下:Syntax error on token " ...
- 【转】SVN提交一般原则
写在前面: 最近, 跳槽了. 来到了一家感觉QIAN景不错的创业公司. 由于是开始, 规模比较小, SVN的管理工作, 也有我来承担. 今天发生了一些相当不愉快的事情, 就是因为一个同事, ①签入代码 ...
- 自定义shiro的Realm实现和CredentialsMatcher实现以及Token实现
Realm是shiro比较核心的接口,简单说它的实现类就是校验用户输入的账号信息的地方.如果想自定义实现一般的配置文件如下: <!--自定义Realm 继承自AuthorizingRealm - ...