美文网首页ROS
c++头文件实现函数的问题

c++头文件实现函数的问题

作者: 陈瓜瓜_ARPG | 来源:发表于2018-12-01 11:52 被阅读600次

随笔,主要是给自己看的.内容可能不甚详细.

头文件即.h文件一般是用来写函数或者类的定义的,而函数的实现一般在cpp文件中完成.但是我也看到过一些文件就在头文件中同时定义函数和实现.打个比方我现在有个头文件名叫header.h,内容如下

#include <iostream>

void printInt(int number){
    std::cout<<"print an int number "<<number<<std::endl;
}

这个头文件同时定义与实现了这个函数.似乎不像是头文件的功能,但是这是允许的.那么这会不会造成什么问题呢?会的.如果你有两个文件同时包含了这个头文件并一起编译,就会有error产生.
比如,你有一个cpp文件叫main.cpp,一个cpp文件叫test.cpp,两个文件都包含头文件header.h,里面实现了某个内容.编译时(这里使用CMakeLists.txt的语法作为例子)我们一起编译这两个文件

add_executable(main main.cpp test.cpp)

就会出现问题.给出的错误是...multiple definition....这个原因是test.cpp和main.cpp实现并定义了函数printInt,所以有重复定义.但这个问题很有意思的是如果你把函数写到类中,如下面

#include <iostream>

class Print{
    void printInt(int number){
        std::cout<<"print an int number "<<number<<std::endl;
    }
};

则同样被两个文件包含,同样的编译,却不会出现error能正常编译.
更有意思的是,我们经常喜欢在类外实现函数定义,即头文件改成如下面的这个样子

#include <iostream>

class Print{
    void printInt(int number);
};

void Print::printInt(int number){
        std::cout<<"print an int number "<<number<<std::endl;
}

再重复上面的步骤编译,又会出现同样的multi definition的error了.

在头文件的实现中,有两种语法,即使实现了函数且被重复包含,也是不会出错的.一个是模版.模版需要定义和实现必须写在一起,无论是写在头文件还是cpp文件中.第二种是内联inline函数.即利用下面语句定义的函数.

inline function_type function_name(){...}

个人想法是,除非用hpp文件(个人其实不经常使用)或者写模版内联函数,函数或者类的定义和实现还是分开在头文件和cpp源文件中写更好了.第一是代码清晰好读,第二是就算是函数写在类中实现没有大的问题,有经验的程序猿知道我们debug时头文件中函数实现部分的修改会导致包含头文件的所有文件重新编译,编译会耗时更长.分开写的画就算在debug时我们改变函数内容,也只会影响很少一部分.(好像说得完全不清楚....大家自己去网上查啦).

相关文章

  • 第十五章:源文件与程序

    C头文件实现C++头文件方式 函数指针image.png 头文件的使用image.pngimage.pngimag...

  • c++头文件实现函数的问题

    随笔,主要是给自己看的.内容可能不甚详细. 头文件即.h文件一般是用来写函数或者类的定义的,而函数的实现一般在cp...

  • JNI——C++基础一

    创建一个C++项目: 把头文件中构造函数和析构函数的具体实现放在cpp文件中,这里的public和private跟...

  • STL之二分查找

    需要包含头文件algorithm C++ STL实现二分查找的函数有三个:lower_bound、upper_bo...

  • inl文件

    inl 文件是内联函数的源文件。内联函数通常在c++头文件中实现,但有的时候内联函数较多或者出于一些别的考虑(使头...

  • 定时器函数手写实现

    头文件: 函数定义: 函数实现: 调用方法:

  • c++的cmath库常用函数

    如果你想用 c++ 解决计算问题,也许你会用到 cmath 头文件,其中有很多数学函数,这里只介绍常用的数学函数。...

  • c++ 在windows 和linux 下的兼容代码

    背景 有时在C++ 中调用有关操作系统的函数时,需要不同的头文件,(例如Sleep()函数window下在头文件w...

  • gcc编译器 多文件编译

    这个问题实际上是说,已知头文件"a.h"声明了一系列函数(仅有函数原型,没有函数实现),"b.cpp"中实现了这些...

  • sort用法(转)

    一、c++标准库里的排序函数的使用方法 ​I)Sort函数包含在头文件为#include的c++标准库中 II)S...

网友评论

    本文标题:c++头文件实现函数的问题

    本文链接:https://www.haomeiwen.com/subject/imilcqtx.html