2022年C++关于声明,定义,类的定义,头文件作用 .pdf
《2022年C++关于声明,定义,类的定义,头文件作用 .pdf》由会员分享,可在线阅读,更多相关《2022年C++关于声明,定义,类的定义,头文件作用 .pdf(11页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、C+ 关于声明,定义,类的定义,头文件作用,防止头文件在同一个编译单元重复引用,不具名空间1. 编译单元,一个 .cc ,或.cpp 作为一个编译单元 .生成.o2. 普通数据类型的定义,声明,函数的定义声明(类函数是一样的)extern int x; /变量是声明,并未实际分配地址,未产生实际目标代码void print(); / 函数声明,未产生实际目标代码如 int x; int x = 3 ; void print() ; /均为定义 产生了实际目标代码 。声明不产生实际的目标代码,它的作用是告诉编译器,OK,我在该编译单元后面,或者其它编译单元会有这个x 变量, print函数的定义
2、。否则编译器如果发现程序用到x,print ,而前面没有声明会报错。如果有声明,而没有定义,那么链接的时候会报错未定义。比较常见的是我在source.cc中调用 print(),而 head.h中声明print (),而 source.cc 中 includehead.h从而就有了 print的声明,可以通过编译,但是如果在所有编译单元中没有 print函数的定义,那么链接的时候 source.o单元就会出错,因为它试图用print函数但是找不到print的定义。/head.hvoid pirnt();/source.ccvoid foo() print();由于声明不产生实际代码,所以可以有
3、多个重复声明的存在。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 11 页 - - - - - - - - - /source1.ccextern int x;/source2.ccextern int x;甚至同一个编译单元也可以有多各个重复声明/source1.ccextern int x;extern int x;而普通变量定义,函数定义是不允许的。3. 同一编译单元内部的重名符号在编译期就被阻止了,而不同编译单元之间的重名符号要到链接器才会被发现。如果你在一个s
4、ource1.cc中/source1.ccint x;int x;出现两次int x; int x;即两个 x 的定义,会编译报错 ,x 重复定义。如果你的/source1.ccint x;/source2.ccint x;g+ o test source1.cc source2.cc那么编译过程不会出错,在链接过程,由于目标代码中有两个全局域的x,会链接出错, x 重定义。不同的编程人员可能会写不同的模块,那么很容易出现这种情况, 如何避免呢,namespace可以避免重名。google 编程规范鼓励使用 不具名空间名师资料总结 - - -精品资料欢迎下载 - - - - - - - - -
5、 - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 11 页 - - - - - - - - - /source1.ccnamespace int x;/source2.ccnamespace int x;OK, 现在不会链接出错了因为两个x 不重名了,当然对于这个简单的例子只在 source1.cc中用不具名命名空间就可避免链接出差了。 / 注 /source1.ccnamespace int x; /source1.cc static int x;有什么区别呢,看上去效果一样,区别在于不具名空间的x 仍然具有外链接,但是由于它是不具名的,所以别的
6、单元没办法链接到,如果namespace hahaint x; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 11 页 - - - - - - - - - 则在别的单元可以用haha:x访问到它, static 则因为是内部链接特性,所以无法链接到。C+ 中 static 和 anonymousenamespace的差别2009-01-02 14:54 | 分类: 桌面应用开发记得以前一个同事问我为什么程序里使用了anonymousenamespace, 想了想就回答说
7、其实就是保持局部性(这也是我的目的),然后就有人说为什么不用static ,嗯 似乎这 两 个 东 西 乍 一 看 没 什 么 区 别 , 自 己 便Google了 一 下 , 发 现 有 一 个 原 因 就 是anonymousenamespace 里的member 都是有外部链接的,只不过永远都不能被外部link到!而 static就明确为根本没有外部链接!此时就出现问题了,在模板里无类型的参数必须是有外部链接的才可以,否则编译无法通;比如:template class Foobar ; namespace void abc() wcout_T( ”abc”)endl; static vo
8、id efg() wcout_T( ”efg ”)endl; int _tmain(int argc, _TCHAR* argv) Foobarxyz /! ;这一行可以通过Foobarrst; /! 注意这一行编译不过return 0; 也有人认为使用anon namespace比较好,因为static的方式被C+98 标准所批评,呵呵 总体来说,其实你完全可以用anony namespace代替 static 。4. 关于头文件。/head.hint x;/source1.cc#include “ head.h ”名师资料总结 - - -精品资料欢迎下载 - - - - - - - - -
9、 - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 11 页 - - - - - - - - - /source2.cc#include “ head.h ”头文件不被编译, .cc 中的引用include “ head.h”其实就是在预编译的时候将 head.h中的内容插入到 .cc 中。所以上面的例子如果g+ o test source1.cc source2.cc, 同样会链时发现重复定义的全局变量 x。因此变量定义, 包括函数的定义不要写到头文件中,因为头文件很可能要被多个.cc 引用。那么如果我的 head.h如下这么写呢,是否防止了x 的
10、链接时重定义出错呢?/head.h#ifndef _HEAD_H_#define _HEAD_H_int x;#endif/source1.cc#include “ head.h ”/source2.cc#include “ head.h ”现在是否 g+ o test source1.cc source2.cc就没有问题了呢,答案是否定的。所有的头文件都是应该如上加#ifndef #endif的, 但它的作用是防止头文件在 同一编译单元 被重复引用。就是说防止可能的/source1.cc#include “ head.h ”#include “ head.h ”名师资料总结 - - -精品资
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年C+关于声明 定义 类的定义 头文件作用 2022 C+ 关于 声明 定义 文件 作用
限制150内