设置内联函数的正确方法
Corret way to set up inline function
我想在 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
这样的风格是否正确,可以将函数视为内联函数?
顺便说一句,有人告诉我,如果我将内联函数的定义放在源文件中,链接时可能会导致“未定义的引用”问题。我确实遇到过一次这个问题,解决方法是删除源文件中的 "inline" 关键字。但是,仍然有一些函数在源文件中使用内联关键字进行定义。这个函数没有触发任何链接错误,所以我现在对使用 "inline" 关键字的正确方法感到困惑。
有没有人对此有一些想法?
inline
关键字告诉编译器可以在多个编译单元中定义该函数,只要所有定义完全相同即可。而已。不多也不少。
这意味着标记在 .cpp 文件中定义的函数 inline
并没有真正做任何事情,除非您打算手动 copy/paste 该定义到多个 .cpp文件(你显然不应该这样做)。
至于有还是没有单独的声明:这完全是风格问题。我发现它是多余的,但有些人喜欢前向声明他们所有的功能,这样他们就不必担心在某些调用其他功能时以正确的顺序定义它们。
您可以从他们的 official documentation of inline function in c++ 中获得概述,
When to use -
Function can be made as inline as per programmer need. Some useful recommendation are mentioned below-
- Use inline function when performance is needed.
- Use inline function over macros.
- Prefer to use inline keyword outside the class with the function definition to hide implementation details.
另外值得一提的是same地方,
Pros :-
...
- By marking it as inline, you can put a function definition in a header file (i.e. it can be included in multiple compilation unit, without the linker complaining)
和
Cons :-
...
- When used in a header, it makes your header file larger with information which users don’t care.
我做的是,由于函数很小(应该是),所以将它包含在头文件中,这样
#ifndef FUN_H
#define FUN_H
inline void fun(int a) { return ++a; }
#endif // FUN_H
因此您不会被函数定义所淹没,并且可以在不滚动太多的情况下阅读函数,也可以跳过您在问题中提到的编译问题。
我想在 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
这样的风格是否正确,可以将函数视为内联函数?
顺便说一句,有人告诉我,如果我将内联函数的定义放在源文件中,链接时可能会导致“未定义的引用”问题。我确实遇到过一次这个问题,解决方法是删除源文件中的 "inline" 关键字。但是,仍然有一些函数在源文件中使用内联关键字进行定义。这个函数没有触发任何链接错误,所以我现在对使用 "inline" 关键字的正确方法感到困惑。
有没有人对此有一些想法?
inline
关键字告诉编译器可以在多个编译单元中定义该函数,只要所有定义完全相同即可。而已。不多也不少。
这意味着标记在 .cpp 文件中定义的函数 inline
并没有真正做任何事情,除非您打算手动 copy/paste 该定义到多个 .cpp文件(你显然不应该这样做)。
至于有还是没有单独的声明:这完全是风格问题。我发现它是多余的,但有些人喜欢前向声明他们所有的功能,这样他们就不必担心在某些调用其他功能时以正确的顺序定义它们。
您可以从他们的 official documentation of inline function in c++ 中获得概述,
When to use -
Function can be made as inline as per programmer need. Some useful recommendation are mentioned below-
- Use inline function when performance is needed.
- Use inline function over macros.
- Prefer to use inline keyword outside the class with the function definition to hide implementation details.
另外值得一提的是same地方,
Pros :-
...
- By marking it as inline, you can put a function definition in a header file (i.e. it can be included in multiple compilation unit, without the linker complaining)
和
Cons :-
...
- When used in a header, it makes your header file larger with information which users don’t care.
我做的是,由于函数很小(应该是),所以将它包含在头文件中,这样
#ifndef FUN_H
#define FUN_H
inline void fun(int a) { return ++a; }
#endif // FUN_H
因此您不会被函数定义所淹没,并且可以在不滚动太多的情况下阅读函数,也可以跳过您在问题中提到的编译问题。