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的主要内容,如果未能解决你的问题,请参考以下文章

洛谷 P2559 [AHOI2002]哈利·波特与魔法石

洛谷——P2559 [AHOI2002]哈利·波特与魔法石

在 Java 中针对接口进行编程与在 C/C++ 中使用头文件的概念相同吗?

计算材料学狄拉克符号补充 矢量与函数的统一性

windows与linux 头文件对照

C/C++的静态库与动态库