C/C++补充材料·头文件与代码文件与inline
2021/6/7 22:27:08
本文主要是介绍C/C++补充材料·头文件与代码文件与inline,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
一些学生提问
学生甲:关于inline
函数的想法
inline
是一个建议性的函数,即系统会根据具体情况是否决定是否进行inline
替换,那么在最初编写编译程序时,为什么不直接把这个判断做为一种优化,即自动判断是否要替换,而不需要人为地输入?
另外,为了程序执行的效率,我能不能把所有的函数声明时均加上inline
,以此使程序执行效率更高?
学生乙:关于include(1)
如果#include <iostream>
两次,没有关系…
但是如果自己写一个.h头文件,#include
两次,会出现问题…
我记得原因好像是iostream中define了一个什么东西,规定如果被include多次,那么后面被include的iostream全部无效之类的吧…
不知道是不是这个原因。
学生丙:关于include(2)
还有如果嵌套包含的话也会出现一个问题,具体地说:
以下内容为head1.h:
void fun() { return; }
以下内容为head2.h:
#include"head1.h"
以下内容为main.cpp
#include<iostream> #include"head2.h" #include"head1.h" using namespace std; int main() { fun(); return 0; }
就是说fun()
被重复定义了两次,而无法被链接通过。
那这种情况下有哪些解决方法呢?
我发现的解决方法只有一种,即自己判断,使自己编写的头文件只被包含一次,即去掉main
函数里的#include "head1.h"
一行
对问题的回答
关于inline
函数的想法
首先,这不一定是优化(如果一个函数生成的机器代码是100kB,又被调用了100次,那么这些地方全部内联的话,生成的执行文件就是10MB,而原来只要100kB就行);其次,有些情况下无法优化,比如,操作系统经常有补丁,其实就是修订了一些函数的实现,如果程序里都inline
了,系统更新就实现不了了。
现代编译器开了优化选项时候,是能自动判断一些情况要不要内联掉的。但inline
关键字还是能对编译器起一些提示作用的,特别是在用到模板的时候,所以语法上这个关键字还是要留用的,不能完全交给编译器。
include(1)
标准方式是#ifndef/#define/#endif。
另外,现在主流的编译器都支持#pragma once这种形式。具体内容大家自己查吧。
include(2)
错误原因是同名函数有多个实现,所以无法连接;解决方法最好是在头文件里加上重复引用保护能力(#ifndef/#define/#endif或者#pragma once)。
这篇关于C/C++补充材料·头文件与代码文件与inline的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23增量更新怎么做?-icode9专业技术文章分享
- 2024-11-23压缩包加密方案有哪些?-icode9专业技术文章分享
- 2024-11-23用shell怎么写一个开机时自动同步远程仓库的代码?-icode9专业技术文章分享
- 2024-11-23webman可以同步自己的仓库吗?-icode9专业技术文章分享
- 2024-11-23在 Webman 中怎么判断是否有某命令进程正在运行?-icode9专业技术文章分享
- 2024-11-23如何重置new Swiper?-icode9专业技术文章分享
- 2024-11-23oss直传有什么好处?-icode9专业技术文章分享
- 2024-11-23如何将oss直传封装成一个组件在其他页面调用时都可以使用?-icode9专业技术文章分享
- 2024-11-23怎么使用laravel 11在代码里获取路由列表?-icode9专业技术文章分享
- 2024-11-22怎么实现ansible playbook 备份代码中命名包含时间戳功能?-icode9专业技术文章分享