欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > IT业 > 关于头文件

关于头文件

2024/10/25 1:29:06 来源:https://blog.csdn.net/2301_77560238/article/details/142106377  浏览:    关键词:关于头文件

提示:文章

文章目录

  • 前言
  • 一、背景
  • 二、
    • 2.1
    • 2.2
  • 总结

前言

前期疑问:
本文目标:


一、背景

2024年9月10日18:50:11

在看代码规范的时候又看到头文件相关的知识点,今天又再次整理一下,对头文件的使用又加深了理解。以前会莫名其妙报些告警,现在遇到应该会好处理了。

上述表述等于是将头文件中哪些可以定义哪些不能定义整理了一下
之前整理的文章是这一篇关于头文件,这次整理时也参考了这篇文章,而且再次看这篇文章的时候有了新的发现。真不错!**

二、

2.1 constexpr定义的变量是否可以放在头文件中

想把constexpr int STATISTICS_MAP_MAX_SIZE = 24 * 6 * 200;放在头文件中,就在疑惑能不能将const放在头文件中

1.在头文件中定义const类型的非static变量,在link时不会报错,这是因为const型的变量在complie时已经转换为常量,每个obj模块里有一个相同内容的常量,并不会有变量名冲突发生。

2.在头文件定义非const类型时,link时报错,这是因为这样相当于在每个包含该头文件的cc文件的全局域定义了一个名字相同的全局变量,虽然在complie时由于分开编译,不会产生错误,但是在link时,将会发生变量名冲突。

3.在头文件中使用extern 声明一个全局变量时可以的,而且是全局变量使用的推荐做法,前提是声明的这个全局变量,已经在一个cc文件,且只在一个cc文件中定义。

4.在头文件中定义的一个static变量,对于包含该头文件的所有源文件,实质上在每个源文件内定义了一个同名的static变量,他们仅为该源文件的全局变量而非全程序的全局变量。实际上在编译过程中,会为其每个obj模块中编译产生不同的名字,所以在link时候不会报错。但这样相当于在每个obj模块中有一个的static变量,它实际上是独立在每个obj模块中的文件级全局变量,不是全程序域的全局变量。

所以,在头文件中,最好只声明而不定义,定义也仅仅定义const型变量

来源:C语言头文件里可不可以定义变量

2.2 结构体是否可以定义在头文件中

总之,结构体的定义位置根据项目的需要和结构体的使用范围来决定。如果需要在多个源文件中共享结构体定义,则应该放在头文件中;如果仅在一个源文件中使用,则可以直接在源文件中定义。

今天重新看了下之前的一篇文章,关于头文件,这篇文章之前是拷贝的其他文章,有缺失,但是今天看了下发现了一个知识点,即之前我在疑问,结构体能否写在头文件中,今天看到那篇文章写到。不能写在头文件中的是变量和函数。

当然结构体可以定义在头文件中,但是如果只有一个源文件使用,就可以写在源文件中。

关于头文件不能定义函数和变量,有几个例外,看到一个文章说的比较好:

参考《C++ Primer中文版》第四版 人民邮电出版社 P58:

因为头文件包含在多个源文件中,所以不应该含有变量或函数的定义。

对于头文件不应该含有定义这一规则,有三个例外。头文件可以定义类、值在编译时就已经知道的const对象和inline函数。这些实体可在多个源文件中定义,只要每个源文件中的定义是相同的。

在头文件中定义这些实体,是因为编译器需要它们的定义(不只是声明)来产生代码

类定义含类作用域内的函数与变量定义,也就是成员函数与数据成员。

1、内成员函数如果隐式内联了,当然没有问题,可以放在头文件中。否则,如果显示内联,可以放在头文件中。如若不然,放在头文件中可能引起重复定义。

2、数据成员:静态成员定义放在头文件中,可能会引起重复定义。非静态数据成员定义在类实例化的时候,才定义。

从根本上分析的话,还得从链接属性上分析。

上述表述等于是将头文件中哪些可以定义哪些不能定义整理了一下

2.2

三、

3.1


总结

未完待续

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com