我想在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”关键字。但是,仍有一些函数在源文件中使用内联关键字进行定义。这个函数没有触发任何链接错误,所以我现在很困惑使用“内联”关键字的正确方法。有人对此有什么想法吗?
答案 0 :(得分:2)
inline
关键字告诉编译器只要所有定义完全相同,就可以在多个编译单元中定义该函数。就是这样。没什么,没什么。
这意味着标记.cpp文件中定义的函数inline
并没有真正做任何事情,除非您计划手动复制/粘贴该定义多个.cpp文件(你显然不应该这样做)。
至于没有单独的声明:这完全是一种风格问题。我发现它是多余的,但有些人喜欢向前声明他们的所有功能,所以如果有人调用其他人,他们就不必担心以正确的顺序定义它们。
答案 1 :(得分:1)
您可以从c ++中的official documentation内联函数中获取概述,
何时使用 -
根据程序员的需要,可以按行内联功能。下面提到了一些有用的建议 -
- 需要性能时使用内联函数。
- 在宏上使用内联函数。
- 喜欢在类外部使用带有函数定义的内联关键字来隐藏实现细节。
醇>
还值得一提的是same地方,
优点: -
...
- 通过将其标记为内联,您可以将函数定义放在头文件中(即它可以包含在多个编译单元中,而不会让链接器抱怨)
醇>
和
缺点: -
...
- 在标题中使用时,会使用户不关心的信息使您的标题文件更大。
醇>
我所做的是,因为函数非常小(应该是这样),所以将它包含在头文件中就像这样
#ifndef FUN_H
#define FUN_H
inline void fun(int a) { return ++a; }
#endif // FUN_H
因此,您不会被函数定义所淹没,并且可以在不滚动太多的情况下读取函数,并且如您在问题中提到的那样跳过编译问题。