C++中的声明与定义
转自:http://www.cnblogs.com/kingcat/archive/2011/12/30/2307426.html
C++是一种复杂的计算机语言,很多在现代高级语言中已经不需要程序员操心的事情(其实这些事情并没有消失而是由语言本身和运行环境替我们做了)在C++中还需要我们处处留意,以免你写的程序编译不通过或者留下潜在BUG。
了解C++的人知道它里面有两个术语:声明,定义 很多新出现的高级语言对二者的界面很模糊,申明==定义,但C++中二者不同,而且需要了解他们的概念,否则你的程序很可能无法编译通过,现在我们来了解一下他们。
定义:就是创建一个对象,并且为他非配对象资源,这个概念比较容易理解。比如说 int a = 1; stirng b("abcd"); 定义是必须的,如果没有定义就无法使用对象。而且同一对象(同一作用范围内的同名同类型)只能定义一次重复定义编译器会报错。
声明:告诉编译器有这个对象存在,并且可以使用,为了理解这个概念先说说C++的一些编码与编译机制。
C++标准允许将一个系统中得不同部分定义在多个文件中,通过INCLUDE合并在一起使用。那么也就允许头文件A中定义的全局A1对象可以被包含该头文件的源文件B使用,这个概念应该容易理解。在说一下C++的编译机制,C++编译时顺序编译内容的,也就是说编译器会一个一个编译文件,然后根据文件的包含关系再做连接,生成一个可执行文件,假设编译器先编译A文件,发现里面定义了A1对象,然后再编译B文件,发现里面使用了一个叫A1的对象,我们假设编译器可以编译通过这个过程没有问题。 但是C++可能会先编译B文件,发现里面有使用一个叫A1的变量,这个时候A文件还未编译,那么编译就会出错中断,如何才能解决这个问题呢,声明技术就出现了,在编译B时候随便还没有A1这个变量被定义,但是如果我先声明一下A1变量,那么就意味着我告诉编译器:系统中是有一给叫A1的变量存在的,请继续编译,编译器在此打个标签继续编译,等编译到A文件时发现了A1的定义,编译器就找到之前打过标签的A1,设置为这个变量是合法的,然后继续向下编译。假设编译器直到编译完所有文件都没有发现A1,就会报错中断编译就会失败,所以申明的作用非常明显。
不仅是跨文件中的对象使用需要申明,就是同一文件中申明也有很重要的作用,先看如下代码:
fun2();
{
;
}
错误很明显,那为什么会出这个错误呢,因为C++编译时顺序编译的,对文件内容页是从上到下做编译,当编译到主函数时发现fun1()调用,因为这个函数在主函数之前定义了所以正常通过,而fun2()函数此时还未定义,所以报错,解决办法很简单,在调用函数前声明一下就可以了:
fun1();
fun2()
}
总而言之在不同文件中定义的共享对象在使用前一定要先声明在使用。在同一文件中使用对象之前还未出现定义语句的对象需要先先声在使用。同一文件中先定义后使用的对象不需要声明可直接使用.
C++中的声明与定义的更多相关文章
- PHP中变量声明和定义的区别
先记录一下(不知道PHP是不是一样,但是C语言是这样的):把建立空间的声明称之为“定义”,而把不需要建立存储空间的声明称之为“声明”.声明的最终目的是为了提前使用,即在定义之前使用,如果不需要提前使用 ...
- C/C++中的声明与定义
含义 声明(Declaration), 用于告诉编译器被声明的函数/变量的存在, 及它们的类型/调用格式信息, 以检查是否被正确调用. 声明不分配内存空间. 定义(Definition), 用于告诉编 ...
- 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用烂笔头记录下来 最早 ...
随机推荐
- C# 打开指定的目录 记住路径中 / 与 \ 的使用方法
老生常谈的问题了,C#在指定目录时,路径中要使用 \\.直接看实例 using System; namespace OpenFile{ class OpenFile{ static void Main ...
- 用EasyClient开源项目采集Windows摄像头/麦克风的音视频进行RTSP直播
EasyClient是EasyDarwin开源流媒体团队开发的一款功能丰富的开源PC客户端项目,目前支持Windows.Android版本,后续将支持ios版本,其中Windows版本的EasyCli ...
- 使用 Visual Studio Code 运行 C# 及 Java 程序
背景 很多情况下,我只是想要编写一个非常简单的 C# 或者 Java 程序,只有几行代码,看看运行结果而已.虽说 Visual Studio / Eclipse / IntelliJ IDEA 功能强 ...
- Mac下通过命令行安装npm install -g 报错,如何解决?
1, 使用 sudo npm install -g n2, 或者 sudo chmod -R 777 /usr/local/lib,然后 npm install -g
- Objective-c继承与组合
Objective-C 继承 继承:是一种XXX是XXX的关系.例如:学生是人,所以学生与人就是继承的关系. #import <Foundation/Foundation.h> @inte ...
- kafka的基本操作
启动ZooKeeper 打开一个新终端并键入以下命令 - bin/zookeeper-server-start.sh config/zookeeper.properties 要启动Kafka Brok ...
- 重新认识vue之事件阻止冒泡
冒泡的表现 近期用vue做了一个需求,大概是同一个区域,点击不同位置有不同的响应函数,还有个总的响应函数,好吧,如下图所示: 他们的DOM结构如下: <div v-for="(item ...
- Windows下配置PHPUnit(pear已弃用,使用phpunit.phar)
一.配置PHPUnit 首先到PHPUnit官网(点此进入)下载相应的版本.php 5.5及以下版本请使用PHPUnit 4.8.得到 .phar 文件,并把名字改为 phpunit.phar . 把 ...
- HTML初级教程 表单form
表单本身是没有什么用的.这需要编一个程序来处理输入表单中的数据.这也超出了本站指南的范围.如果使用网络服务器来放置HTML,你能够自助地找到一些简单的教程,开发一个服务器端的程序使一个发送到Email ...
- linuxshell,闲散命令记录
1. 移动光标到 0:0 位置 printf "\033[0;0H" 2. 清屏 printf "\033[2J" 3. awk接收 外部变量 awk -v v ...