转自: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++中的声明与定义的更多相关文章

  1. PHP中变量声明和定义的区别

    先记录一下(不知道PHP是不是一样,但是C语言是这样的):把建立空间的声明称之为“定义”,而把不需要建立存储空间的声明称之为“声明”.声明的最终目的是为了提前使用,即在定义之前使用,如果不需要提前使用 ...

  2. C/C++中的声明与定义

    含义 声明(Declaration), 用于告诉编译器被声明的函数/变量的存在, 及它们的类型/调用格式信息, 以检查是否被正确调用. 声明不分配内存空间. 定义(Definition), 用于告诉编 ...

  3. C语言中的声明与定义的差别

    1.对于以下的声明语句 int a;        假设其位置出如今全部的函数体之外,那么它就被称为外部对象a的定义.这个语句说明了a是一个外部整型变量,同一时候为a分配了存储空间.由于外部对象a并没 ...

  4. C++中复杂声明和定义的辨析

    0x00 前言 c++中的复杂声明往往令人无法下手,经常使人搞错这到底声明的是一个指针还是指针函数.但其实c++对于复杂声明是遵循一定的规则的,叫做变量名—>右--左-右规则. 0x01 规则解 ...

  5. 在源文件(.c)和头文件(.h)中声明和定义的区别——C语言

    最近在看多文件编程的时候遇到的一个问题,本来以为理解了声明和定义的区别(然而并没有····),也算是重新认识了一次声明和定义,下面上代码 情形一:在源文件(.c)中 相信大部分读者对声明和定义的理解是 ...

  6. 浅谈声明与定义的区别 分类: C/C++ 2015-06-01 15:08 157人阅读 评论(4) 收藏

    以下代码使用平台是VS2012. 清楚明白声明与定义是一名合格的程序猿的基本要求. 本人认为,C++编码过程中谈及"声明"和"定义"是因为我们要使用一个变量.类 ...

  7. switch语句下的变量声明和定义

    switch语句下的变量声明和定义的问题: switch...case...语句中存在声明和定义会出现一些问题.这个由switch语法特性决定的, switch中每个case都是平等的层次,区别于一般 ...

  8. 声明、定义 in C++

    序 声明和定义是我们使用的基础,但是对于声明和定义的概念,我们不甚了了,也就是说感觉好像是这样,但是真要详细说明就说不上来. 有博主对于声明和定义有以下描述:          1.需要建立存储空间的 ...

  9. 【转】变量的声明和定义,从C到编译原理到C++,再到Java

    基础学了太久,时间一长有些东西就可能记得不太清楚,俗话说得好,"好记性不如烂笔头",所以把基础中的基础-变量的声明和定义,从C到编译原理到C++,再到Java用烂笔头记录下来 最早 ...

随机推荐

  1. 一个兼容性比较好的图片左右滚动的js

    下载地址:http://www.cnblogs.com/RightDear/admin/Files.aspx 文件:shhds.rar

  2. 2018.11.06 生成器函数进阶&列表推导式&生成器表达式

    1.生成器函数进阶 2.列表推导式 3.生成器表达式

  3. github for unity

  4. 使用php ffmpeg处理视频

    工作中遇到video加载视频的问题,但是视频封面在手机上无法取到视频的第一帧,video标签无法在手机上取到第一帧,经过几天的研究于搜索终于找到比较好用的办法,就是php ffmped 插件,该插件的 ...

  5. MATLAB 2013b .m 文件关联

    使用绿色版的MATLAB无法自动关联.m文件,在网上查到的解决办法是,在MATLAB里运行如下命令: cwd=pwd; cd([matlabroot '\toolbox\matlab\winfun\p ...

  6. Understand .sync in Vue

    Preface The first time I met .sync modifier, I didn't know it very well. So, I seldom use that. Toda ...

  7. android DHCP流程【转】

    本文转载自:http://blog.csdn.net/myvest/article/details/51483647 版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[+]   1 ...

  8. hihocoder#1050 : 树中的最长路(树中最长路算法 两次BFS找根节点求最长+BFS标记路径长度+bfs不容易超时,用dfs做TLE了)

    #1050 : 树中的最长路 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 上回说到,小Ho得到了一棵二叉树玩具,这个玩具是由小球和木棍连接起来的,而在拆拼它的过程中, ...

  9. LightOJ1341 Aladdin and the Flying Carpet —— 唯一分解定理

    题目链接:https://vjudge.net/problem/LightOJ-1341 1341 - Aladdin and the Flying Carpet    PDF (English) S ...

  10. 侧方位停车想一次过,掌握边线30cm很重要!

    侧方位停车要想一次过关,关键在于保持车身距离库边线30cm左右的距离.但是,往往有很多学员掌控不好这个距离,导致倒库时压线.那么,如何找准这个30cm呢?下面,小编就来教大家方法,赶紧学习吧! 侧方位 ...