声明是我们在学习C语言编程开发的时候经常见到的一个设置条件,而今天我们就通过案例分析来了解一下,C语言编程开发前置声明都有哪些作用。

前置声明是C/C++开发中比较常用的技巧,主要用在三种情形:

变量/常量,例如extern int var1;;

函数,例如void foo();,注意类的成员函数无法单独做前置声明;

类,例如class Foo;,也可以前置声明模板类:template classFoo;。如果类包含在名字空间中,需在名字空间内做前置声明:namespace tlanyan {class Foo;};,而不能这样:class

tlanyan::Foo;。

前置声明作用

根据其用途,前置声明的主要作用为:

避免重复定义变量;

避免引入函数定义/声明文件,从而函数文件发生更改时不会重新编译依赖文件;

解决循环依赖问题。

前两种用途好理解,三种稍微复杂点,但却是前置声明重要的用途。其解决类A包含类B,同时类B包含类A的依赖问题。循环依赖一般是设计层面的问题,可通过接口、引入辅助类等手段化解。前置声明也能解决,只是架构上稍微别扭。

如果你有其他编程语言的经验,会发现c++有点怪异:Java/C#/Python/PHP等语言可以轻松做到循环引用,无需使用类似的前置声明技巧。这不禁让人思考:C++为何必须要用前置声明才能化解?

原因在于C++定义对象有两种方式:一种是A a形式,a即对象,调用成员变量或函数用.,对象在栈中分配;另一种是A*

a,a是指针,调用成员变量或函数用->,其指向地址存储实际对象,对象在堆中分配。

那为何前置声明加指针的组合能解决循环引用问题的呢?因为正常情况下,数据类型指针在同一机器的编译器里占同样的内存。指针一般是4或者8个字节,对应32和64位指针。用了指针,即使有循环引用,类的大小也能轻易的确定下来。这也是Java/C#/Python/PHP等可以轻松循环引用的原因:这些语言中,对象变量其实都是指针,也意味着对象变量都是引用传递。

如果不移除文件的相互包含,能否省去前置声明呢?答案是不能,原因如下:

C++按照一个个编译单元(translation unit)进行编译,如果两个文件互相包含且没有#pragma

once等包含保护措施,则会出现递归包含,编译器报错;

如果两个头文件都有文件包含保护,编译A时会把B包含进来,但因为B包含了A,A中的包含保护生效,导致B文件内的内容实际未引入A,于是报B为未知符号的错误。

【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。

c语言 前置声明,C语言编程开发前置声明都有哪些作用相关推荐

  1. python语言 行业_如何入门编程开发行业 选择Python语言怎么样

    如何入门编程开发行业?选择Python语言怎么样?Python是一种面向对象的解释型计算机程序设计语言,它是纯粹的自由软件,语法简洁清晰,它具有丰富和强大的库.它常被称为胶水语言,能够把用其他语言制作 ...

  2. c语言 编程 函数声明,C语言编程开发中的函数声明与定义

    函数功能的使用在许多编程开发语言中都是有不同的使用方法的,而今天我们就一起来了解一下,在C语言编程开发中的函数功能使用与定义. 对函数的"定义"和"声明"不是一 ...

  3. 【Golang第8章:面向对象编程】Go语言的结构体是什么,怎么声明;Golang方法的调用和声明;go语言面向对象实例,go语言工厂模式;golang面向对象的三大特性:继承、封装、多态

    介绍 这个是在B站上看边看视频边做的笔记,这一章是Glang面向对象编程 这一章内容较多,内容有Go语言的结构体是什么,怎么声明:Golang方法的调用和声明:go语言面向对象实例,go语言工厂模式: ...

  4. 用 Go 语言,做 Web 编程开发

    人民邮电出版社和实验楼合作的第 15 本书来了! Web 介绍 Web 应用在我们的生活中无处不在.看看我们日常使用的各个应用程序,它们要么是 Web 应用,要么是移动 App 这类 Web 应用的变 ...

  5. python语言程序设计难不难_零基础学Python编程开发难度大吗?从哪学起?

    转行零基础学Python编程开发难度大吗?从哪学起? 近期很多小伙伴问我,如果自己转行学习Python,完全0基础能否学会呢?Python的难度到底有多大? 今天,小编就来为大家详细解读一下这个问题. ...

  6. C语言的结构体前置声明,?C语言的不完整类型和前置声明

    声明与定义(Declaration and Definition) 开始这篇文章之前,我们先弄懂变量的declaration和definition的区别,即变量的声明和定义的区别. 一般情况下,我们这 ...

  7. C语言编程开发中用好位操作符

    C语言编程开发中用好位操作符 1. C语言中的位操作符 因为C语言的设计目的是取代汇编语言,所以它必须支持汇编语言所具有的运算能力,所以C语言支持全部的位操作符(Bitwise Operators). ...

  8. Python能成为通用编程开发语言的10大原因

    世界上只有几种编程语言提供多种功能. 在当今世界,开发人员必须能去构建各种类型的应用程序,所以多学习一种多功能开发语言是有必要的. 虽说php是世界上最好的语言,但这也不妨碍Python成为通用编程开 ...

  9. 编程开发8大语言详解,为什么Java是我最推荐的?

    一. 前言 很多没有接触过编程语言的同学,都会觉得编程开发特别高端和神奇,担心理解不了更担心学不会. 当然,也有人会认为,你既然是做编程的,那么你应该什么都会,什么软件的开发都能完成,这是平哥经常听到 ...

最新文章

  1. SpringBoot中使用thymeleaf的switch来实现if-else if -else的效果
  2. 活动 | 参与《我的 ,2019 不一样》投稿,千元奖品,等你拿!
  3. HTML特殊符号/特殊字符
  4. Java微信开发_00_资源汇总贴
  5. python读取文件前30个字符_Python 批量读取文件中指定字符的实现
  6. vmware工具克隆linux系统步骤及配置
  7. ECCV 2020 论文大盘点-人员重识别(ReID)篇
  8. php 数据处理--合并,拆分,追加,去重
  9. 利用AccountsService 漏洞获得Ubuntu系统的root权限
  10. iOS 8 自适应 Cell
  11. WIN7系统开启无线路由共享上网功能
  12. 计算图的可达矩阵MATLAB程序
  13. thinkphp 使用 kindEditor
  14. 怎么复制图片的html代码,修改设置让你轻松复制网页文字或图片
  15. 制作马卡龙渐变海报教程
  16. 5w 字 | 172 图 | 超级赛亚级 Spring Cloud 实战
  17. 第35讲:Xposed+模拟器的详细使用
  18. 注意:网站中出现以下违规内容-搜索引擎百度都不收录
  19. 计算机奖学金用英语怎么说,奖学金证书的翻译,三好学生荣誉证书,优秀学生干部荣誉证书的英语,英语四、六级和计算机证书,辅修证书的英语怎么说, 教学实践单项奖,社会实践单项奖用英语怎么说...
  20. IOS数据库操作SQLite3使用详解(转)

热门文章

  1. 2022年中国农业现代化发展现状
  2. OpenCV4 Viz模块使用学习(二)
  3. 12.Opencv大作业——实现鼠标绘制基本图形
  4. RK3588 VR、AR、MR和XR场景下的解决方案
  5. 用Python自动生成Excel数据报表!
  6. 《算法笔记》第四章笔记
  7. 如何在离开计算机后加密锁定,如何对企业电脑硬盘文件进行加密?
  8. Flutter 开发中最实用的 Dart 语法知识
  9. 中南大学python考试_Python数据分析与展示_中国大学_答案2021年知到精神病学(中南大学)章节答案...
  10. 保姆级教程:群晖nas内网穿透之ipv6/ipv4 ddns+frp双管齐下!