C/C++补充材料·头文件与代码文件与inline
Posted 如何开发工业软件
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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的主要内容,如果未能解决你的问题,请参考以下文章