Corret方式设置内联函数

时间:2017-11-16 00:30:30

标签: c++ inline header-files

我想在c ++中定义内联函数。例如,在此函数fun.h的头文件中,我有

#ifndef FUN_H
#define FUN_H

void fun(int);

#endif // FUN_H

并在源文件fun.cpp中我有

#include "fun.h"

inline void fun(int a){
    return ++a;
}

我知道这是定义内联函数的一种方法,但我确实看到很多人说内联函数的实现应该直接在头文件fun.h中,这意味着以下模式,

#ifndef FUN_H
#define FUN_H

inline void fun(int a){
    return ++a;
}

#endif // FUN_H

但是,我不想将所有代码挤在一起,所以我这样编码,

#ifndef FUN_H
#define FUN_H

void fun(int);

inline void fun(int a){
    return ++a;
}
#endif // FUN_H

这是一个正确的样式,以便可以将该函数视为内联函数吗?

Btw,有人告诉我,如果我将内联函数的定义放在源文件中,它可能会在链接时导致“未定义引用”问题。我确实遇到过这个问题,解决方法是删除源文件中的“inline”关键字。但是,仍有一些函数在源文件中使用内联关键字进行定义。这个函数没有触发任何链接错误,所以我现在很困惑使用“内联”关键字的正确方法。

有人对此有什么想法吗?

2 个答案:

答案 0 :(得分:2)

inline关键字告诉编译器只要所有定义完全相同,就可以在多个编译单元中定义该函数。就是这样。没什么,没什么。

这意味着标记.cpp文件中定义的函数inline并没有真正做任何事情,除非您计划手动复制/粘贴该定义多个.cpp文件(你显然不应该这样做)。

至于没有单独的声明:这完全是一种风格问题。我发现它是多余的,但有些人喜欢向前声明他们的所有功能,所以如果有人调用其他人,他们就不必担心以正确的顺序定义它们。

答案 1 :(得分:1)

您可以从c ++中的official documentation内联函数中获取概述,

  

何时使用 -

     

根据程序员的需要,可以按行内联功能。下面提到了一些有用的建议 -

     
      
  1. 需要性能时使用内联函数。
  2.   
  3. 在宏上使用内联函数。
  4.   
  5. 喜欢在类外部使用带有函数定义的内联关键字来隐藏实现细节。
  6.   

还值得一提的是same地方,

  

优点: -

     

...

     
      
  1. 通过将其标记为内联,您可以将函数定义放在头文件中(即它可以包含在多个编译单元中,而不会让链接器抱怨)
  2.   

  

缺点: -

     

...

     
      
  1. 在标题中使用时,会使用户不关心的信息使您的标题文件更大。
  2.   

我所做的是,因为函数非常小(应该是这样),所以将它包含在头文件中就像这样

#ifndef FUN_H
#define FUN_H

inline void fun(int a) { return ++a; }

#endif // FUN_H

因此,您不会被函数定义所淹没,并且可以在不滚动太多的情况下读取函数,并且如您在问题中提到的那样跳过编译问题。