inline
函数的想法inline
是一个建议性的函数,即系统会根据具体情况是否决定是否进行inline
替换,那么在最初编写编译程序时,为什么不直接把这个判断做为一种优化,即自动判断是否要替换,而不需要人为地输入?
另外,为了程序执行的效率,我能不能把所有的函数声明时均加上inline
,以此使程序执行效率更高?
如果#include <iostream>
两次,没有关系…
但是如果自己写一个.h头文件,#include
两次,会出现问题…
我记得原因好像是iostream中define了一个什么东西,规定如果被include多次,那么后面被include的iostream全部无效之类的吧…
不知道是不是这个原因。
还有如果嵌套包含的话也会出现一个问题,具体地说:
以下内容为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
关键字还是能对编译器起一些提示作用的,特别是在用到模板的时候,所以语法上这个关键字还是要留用的,不能完全交给编译器。
标准方式是#ifndef/#define/#endif。
另外,现在主流的编译器都支持#pragma once这种形式。具体内容大家自己查吧。
错误原因是同名函数有多个实现,所以无法连接;解决方法最好是在头文件里加上重复引用保护能力(#ifndef/#define/#endif或者#pragma once)。