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

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

e940cb6e7190159a1349af4059fee9fc.png

前置声明是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为未知符号的错误。

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值