我遇到了一个头文件,其中包括各种内联和const的函数原型声明:
inline bool Foo1() const;
inline bool Foo2() const;
inline bool Foo3() const;
...
我理解内联关键字允许编译器(潜在地)在调用函数时扩展函数,但为什么不包括函数体呢?
如果定义包含在头文件中,对我来说会更有意义:
inline bool Foo1() const { return m_Foo1; };
inline bool Foo2() const { return m_Foo2; };
inline bool Foo3() const { return m_Foo3; };
...
在原型上使用内联的意义是什么?
这可能只是一个错误,但最可能的是程序员想使函数内联,但不想让这些函数的实现使文件的那部分混乱。在编写"仅标头"代码时,这是一种相当常见的模式。您有一个没有(或很少)实现的普通头文件和另一个包含的文件,但其行为类似于实现文件并包含所有实现。
它只是允许一个类接口紧凑地显示。
函数定义稍后存在于编译单元中(在调用它们之前,如果调用,则)
来自Dr. Dobb's:
函数定义或函数原型都可以内联声明。如果函数原型是内联声明的,如果函数被调用
,则该函数的单独定义必须出现在模块的其他地方。
原因有很多。
- 你需要空函数声明来解决一个函数调用另一个函数的依赖问题。
- 由于风格原因。
唯一的约束是函数定义必须包含在使用内联函数的每个编译单元中。否则,内联函数在声明和定义方式上与普通函数完全相同。
因为函数可能在目标文件中,开发人员不希望任何人看到源代码。