如何将函数实现放在头文件内

编写含有函数实现的头文件的问题

我们都知道可以这样编写头文件:

1
2
3
4
5
6
7
8
9
//header.hpp
#ifndef __HEADER_HPP__
#define __HEADER_HPP__

int mysum(int a, int b){
    return a+b;
}

#endif

但是考虑下面的文件包含情况:

包含关系

这里function.hpp包含了header.hpp,然后main.cpp包含了function.hpp

在这种情况下按照左下角的方式编译,会报错说mysum函数重复。

我个人认为是这个原因: 首先function.cpp会包含function.hpp,function.hpp会包含header.hpp,这样生成的functino.o就会有一份mysum函数了。 然后main.cpp会包含function.hpp,这样生成的main.o中就有一个mysum函数了。

最后再对main.o,function.o编译,这样由于两个中间文件有同一个函数,就会重复。

解决办法

解决办法就是在mysum前面加上static。 之所以加上static,是因为static关键字会保证其后面的函数(或变量)在全局中只有一份。这样的话在对main.o,function.o编译的时候就只会留下一份拷贝,也就避免了函数重复了。

另:关于#pragma once 和#ifndef...#define语句的区别

一般写程序,为了防止头文件重复包含,会通过#ifndef XXX #define XXX #endif这种语句来保证不被包含。其实还有另一种方式#pragma once也可以。

区别在于:#ifndef形式是C/C++支持的,在语言标准内的。而#pragma once是由编译器保证的,有些编译器是不支持。而且#pragma once只能对全部文件进行包含检测,#ifndef格式却能对局部进行检测。所以平常用#ifndef多一些。

参考

C/C++中#pragma once的使用

updatedupdated2023-06-182023-06-18