首页 > 其他分享 >头文件中应该放什么东西

头文件中应该放什么东西

时间:2023-05-04 19:44:51浏览次数:38  
标签:文件 头文件 定义 int 东西 static cpp 应该

头文件中的内容在编译时会填充到include这个头文件的cpp文件中,所以头文件中有什么东西,相当于cpp文件中也有什么东西,如果有多个include这个头文件的cpp文件,

那么它们相当于都获得了这个头文件中的内容的一个副本,发生重定义错误。所以很多东西的定义不能放在头文件,只能放声明,否则会出现多个副本。

 

static的使用

在c++引入命名空间之前,程序需要将名字声明成static的以使其只对整个文件有效,而对外部文件不可见。这个做法继承自C语言,但引入命名空间后,这个做法已经被取消了,现在的做法是在未命名的命名空间内存放对象。(c++ primer P701)

所以:

1. 如果希望对象只能在文件内访问,就把它放到文件内的未命名空间。

 

2. 如果是需要多个文件共同访问的全局对象,则在其中一个cpp文件中(注意全局对象的定义不能放在头文件)使用单例模式:

extern int targetObj(){

static int obj = 1;

return obj;

}

使用单例模式的原因:

c++对“定义于不同的编译单元内的non-local static对象”的初始化相对次序并无明确定义。比如A,B两个对象分别定义于不同的cpp文件,A对象的初始化依赖B对象,所以B对象的初始化必须先于A对象。

c++保证,函数内的local static对象会在“该函数被调用期间”“首次遇到这个local static对象”时被初始化,所以把B对象放到类似上面的targetObj函数内,A在使用B时调用单例模式函数,就能保证B已经被初始化。(effective c++ P31)

 

3. 对于会被多个不同的cpp文件调用的全局对象(例如上面这个单例模式函数),它的定义可以放在某个cpp文件中,前面加上extern,然后在头文件的函数声明中也加上extern,

这样其他cpp文件要调用这个函数只需要include这个头文件即可。(c++ primer P54)

 

总结:

头文件内只放各种对象的声明,而定义放在cpp文件中(内联函数,函数模板,模板类,模板显式实例化除外),对于多个cpp共用的全局变量,将其定义放在其中一个cpp文件(需要保证初始化顺序时使用单例模式),

然后在定义和声明前面都加上extern,其他cpp文件使用的使用直接在文件内进行extern声明即可。对于只在文件内使用的对象,将其定义放到未命名空间内。

对于宏定义和typedef,如果只在一个cpp文件中使用,则放在这个cpp文件中;若果多个源文件中需要使用这个宏,则放在头文件中定义。

// radio.h
#ifndef __RADIO_H__
#define __RADIO_H__

// 应包含内容
class Radio                                // 正确:类定义
{
    static int s_count;                    // 正确:静态数据成员声明
    static const double S_PI;              // 正确:静态常量数据成员声明
    int d_size;                            // 正确:数据成员定义
    // ...
public:
    int size() const;                     // 正确:成员函数声明
    // ...
};

inline int Radio::size() const            // 正确:内联函数定义
{
    return d_size;
}

// 不应包含内容
int Radio::s_count;                       // 错误:静态数据成员定义,应放在 .cpp 文件中
double Radio::S_PI = 3.1415926;           // 错误:静态常量数据成员定义,应放在 .cpp 文件中
int Radio::size() const { /*...*/ }       // 错误:成员函数定义,应放在 .cpp 文件中
int z;                                    // 错误:外部数据定义
extern int LENGTH = 10;                   // 错误:外部数据定义
const int WIDTH = 5;                      // 避免:常量数据定义
static int y;                             // 避免:静态数据定义
static void func() { /*...*/ }            // 避免:静态函数定义

#endif // __RADIO_H__

 在 C++ 头文件的作用域内放置带有内部链接的定义,如静态函数或数据,是合法的,但是这种做法并不理想。这样不仅污染了全局名称空间,而且包含该头文件的每一个编译单元中消耗数据空间。

标签:文件,头文件,定义,int,东西,static,cpp,应该
From: https://www.cnblogs.com/tan-wm/p/17372299.html

相关文章

  • (转载)性能测试应该怎么做?
    (转载)性能测试应该怎么做?转自:https://coolshell.cn/articles/17381.html偶然间看到了阿里中间件Dubbo的性能测试报告,我觉得这份性能测试报告让人觉得做这性能测试的人根本不懂性能测试,我觉得这份报告会把大众带沟里去,所以,想写下这篇文章,做一点科普。首先,这份测试报告里的......
  • 软件测试工程师——你不仅仅应该会点点点
    你眼中的软件测试岗位是怎样的?大部分人可能会给出这样的回答:“测试?简单啊,没什么技术含量,无非就是看需求、看业务手册、看设计文档、然后点点功能是否实现,麻烦点的就是测试下部署安装是否出现兼容性问题等。”没错,不可否认这是你踏入软件测试行业的基本要求,但是互联网时代在飞速发......
  • Debian与Ubuntu到底有什么不同,应该如何选择?
    在CentOS转向CentOSStream之后,这意味着它将变得不可靠。但是幸好,仍然有非常优秀的Linux发行版本在等我们。其中比较有知名度的是Ubuntu以及Debian。我们经常听到的一句话是:UbuntuisbasedonDeibian那它们究竟有什么区别,如果让你来选择,你要如何选择?这篇文章中,我将简单的说......
  • 已经996了,动物们不应该两班倒么
       一天工作8小时,一周5天班,是每个程序猿乃至所有上班族的梦想吧!    国家统计局的数据显示,全国企业就业人员周平均工作时间为46小时,比上月增加0.1小时。数据一出,网友就炸了:    这是谁统计的?你站出来我保证不打你。有时要干到晚上十一二点,没有周末、法定节假日不休的请......
  • 技术面试官应该怎么问?面试者应该怎么答?
        每年年初都是招聘、求职的旺季,不管你是企业面试官,还是职场小鸟,都应该要清楚对方问的是什么,意图在哪里,不要答非所问,一脸迟疑。   年初以来,面试过很多人,面试的内容无非就那么几类,反反复复。在此,我整理了一下,把我常问的通用技术面试题目、面试意图进行罗列出来,如下:1、......
  • 当和别人产生不好解决的矛盾时,应该怎么办?
    当矛盾实在无法解决时,可以想办法激化矛盾,将矛盾的利益受损群体扩大(类似于转移矛盾),让更多人和自己站在同一阵营,当矛盾触及别人利益时,自会有人出手帮你解决矛盾。需要注意的是:1.不要形成需要别人二选一的局面,避免引火烧身。然而,矛盾双方是相辅相成的,事实上,解决矛盾任何一方都能是......
  • 《【企鹅教育】E=MCC中的M应该是什么或怎么回事?》 回复
    《【企鹅教育】E=MCC中的M应该是什么或怎么回事?》      https://tieba.baidu.com/p/8390885888     回复6楼@joywee2007,反相吧的吧友,包括民科吧、理论物理吧等等也是,天天喊着“数学不是物理”,“数学只是工具”,“数学只是一种语言”,“数学是一种形式”,“......
  • 这些表情包十分珍贵,应该让科研人先用
    作为一个两年没放假的可怜人,今年白鸟鸟终于给自己放了一周的假,不情不愿开工后第一件事,先拿起手机整理照片,美其名曰“保持数据的有序性”,结果发现了一堆有趣的表情包和meme,今天就先来个科研人专场吧~首先来个开门红,祝大家新的一年当然,理想是丰满的,现实是骨感的,大部分人回到实验室/办......
  • Kubernetes——浅聊 Affinity,就这么点东西
    浅聊Affinity,就这么点东西在Kubernetes中,Affinity是指用于控制Pod调度的策略,包括亲和性(Affinity)和反亲和性(Anti-Affinity)2种。亲和性(Affinity)包括NodeAffinity和PodAffinity2种。 一、亲和性(Affinity)表示Pod需要部署在哪些节点上。比如需要部署在某些特定的节点......
  • 30岁的我应该何去何从
    前言其实打算写这篇文章很久,只是之前一直在忙着别的事情没办法。一直抽不开身。,所以趁着今天晚上这个时间节点,把这本这篇文章补充齐全。背景30岁的码农应该何去何从相信这个问题都是困扰很多人一个问题,很多人有焦虑加上疫情3年对经济的冲击我相信肯定是越来越难生存,30岁对大多......