0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

谷歌编码规范的前置声明

typedef 来源:typedef 2023-01-04 09:42 次阅读

定义

A "forward declaration" is a declaration of an entity without an associated definition.

“前向声明”是没有关联定义的实体声明。

前置声明的作用

避免重复定义变量

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

解决循环依赖问题

优点

节约编译时间,前置声明了一个类,那么只会编译这个类,而不会编译与之同属一个文件的其它代码。

处理两个类互相依赖的问题,两个类互相包含

//A.h
#include"B.h"
classA{Bb;};

//B.h
#include"A.h"
classB{Aa;};

缺点

前置声明隐藏了依赖关系,头文件改动时,用户的代码会跳过必要的重新编译过程。

前置声明可能会被库的后续更改所破坏。前置声明函数或模板有时会妨碍头文件开发者变动其API。比如想改类的名称,在大型项目中,可以采用兼容做法,将旧类名作为新类名的别名,但是别名不能作为前置声明,所以需要修改类名则需要修改所有前置声明了该类的地方,可能来自多个部门的开发人员用过,这就不太好处理了。

前置声明来自 std:: 的 symbol 时,其行为未定义。

前置声明的类因为只能使用指针或引用,当删除一个前置声明的类的指针时,此行为是未定义的。

很难判断什么时候该用前置声明,什么时候该用 #include。极端情况下,用前置声明代替 #include 可能会悄悄地改变代码的含义:

//b.h:
structB{};
structD:B{};

//good_user.cc:
#include"b.h"
voidf(B*);
voidf(void*);
voidtest(D*x){f(x);}//Callsf(B*)

若把#include换成前置声明,由于声明时不知道D是B的子类,test()中f(x)就会导致f(void*)被调用,而不是f(B*)。

建议

尽可能避免使用前向声明。相反,请包含所需的头文件。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 谷歌
    +关注

    关注

    27

    文章

    5861

    浏览量

    103269
  • 编码
    +关注

    关注

    6

    文章

    835

    浏览量

    54458
  • 函数
    +关注

    关注

    3

    文章

    3903

    浏览量

    61310

原文标题:谷歌编码规范的前置声明

文章出处:【微信号:typedef,微信公众号:typedef】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    安富莱C语言编码规范

    所谓无规矩不成方圆。任何团队,规范都是怎么也绕不开的话题。特别是在我们搞嵌入式C开发的,代码规范乃是开发的重中之重。有太多的理由去做规范,因为每个人的代码编写喜好不同,代码风格也迥然不同。每一个程序员心目中对好代码都有自己的主见
    发表于 07-19 15:19 1060次阅读

    AC97和HD声卡规范简介和前置音频接口的连接

    AC97和HD声卡规范简介和前置音频接口的连接英特尔在AC97音频标准之后,又推出了HD(高保真)音频标准。微软的新操作系统Vista推出UAA音频。这些音频标准对机箱的前置音频面板和接口都有各自
    发表于 11-25 17:02

    Verilog HDL代码书写规范

    :① 逻辑功能正确,②可快速仿真,③ 综合结果最优(如果是hardware model),④可读性较好。2. 范围本规范涉及Verilog HDL编码风格,编码中应注意的问题, Testbench的
    发表于 12-08 14:36

    声明提前和函数的声明前置

    #hello,JS:03-02 声明提前和立即执行函数
    发表于 07-08 06:04

    嵌入式c语言编码规范

    `学习嵌入式的同学应该首先掌握嵌入式编码规范,这样才能更好的嵌入式系统。下面就从这几个方面讲解一下嵌入式c编码规范。注释风格、排版风格、头文件风格、变量定义、宏定义、函数1 注释风格1
    发表于 10-31 14:50

    嵌入式c语言编码规范

    学习嵌入式的同学应该首先掌握嵌入式编码规范,这样才能更好的嵌入式系统。下面就从这几个方面讲解一下嵌入式c编码规范。注释风格、排版风格、头文件风格、变量定义、宏定义、函数1 注释风格1.
    发表于 11-07 15:17

    Python编码规范分享

    国际规范名:PEP 8变量名规范(标识符规范)字符串函数名小写, 多个单词用 _ 分隔开由字母数字或下划线组成,首字母不能为数字 2. 不能为关键字 3. 建议使用驼峰命名法 搜字母小写,第二个单词
    发表于 10-27 07:15

    请问车载嵌入式软件如何声明符合MISRA语言规范

    请问车载嵌入式软件如何声明符合MISRA语言规范?ISO26262对于软件开发的要求是什么?
    发表于 12-27 07:07

    HarmonyOS鸿蒙原生应用开发设计- 隐私声明

    HarmonyOS设计文档中,为大家提供了独特的隐私声明,开发者可以根据需要直接引用。 开发者直接使用官方提供的隐私声明内容,既可以符合HarmonyOS原生应用的开发上架运营规范,又可
    发表于 10-31 14:16

    华为的verilog编码规范

    华为的verilog编码规范
    发表于 11-01 08:41 40次下载
    华为的verilog<b class='flag-5'>编码</b><b class='flag-5'>规范</b>

    C++语言编码规范详细说明

    本文档的主要内容详细介绍的是C++语言编码规范详细说明。
    发表于 01-07 16:19 14次下载
    C++语言<b class='flag-5'>编码</b><b class='flag-5'>规范</b>详细说明

    Java Script的编码规范详细说明

    本文档的主要内容详细介绍的是Java Script的编码规范详细说明。
    发表于 01-10 17:17 7次下载
    Java Script的<b class='flag-5'>编码</b><b class='flag-5'>规范</b>详细说明

    AN-562:过滤ADV719x视频编码器内部滤波器规范

    AN-562:过滤ADV719x视频编码器内部滤波器规范
    发表于 04-21 10:23 8次下载
    AN-562:过滤ADV719x视频<b class='flag-5'>编码</b>器内部滤波器<b class='flag-5'>规范</b>

    编码规范的本质是什么

    不知不觉间,代码也写了二十余载,我已成精了。借着过来人的身份和语气,有一件事情我一直都特别喜欢吐槽:无论过去多少年,中国的嵌入式软件开发者群体似乎一直对一个叫做“编码规范”的东西趋之若鹜,仿佛
    的头像 发表于 08-16 14:23 2054次阅读

    嵌入式软件之c语言编码规范

    嵌入式软件之c语言编码规范
    发表于 10-28 18:13 28次下载