编写含有函数实现的头文件的问题
我们都知道可以这样编写头文件:
|
|
但是考虑下面的文件包含情况:
这里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
多一些。