内联函数的前向声明

22

我有一个头文件,其中包含大量(30+)的内联函数。

为了避免读者滚动或搜索内联函数的定义(实现),我想要一个“前向声明”部分,该部分陈述了带有注释的函数声明。 这个部分可以让读者找到如何使用函数或查找函数,而不必向下滚动到实现部分。

此外,我希望读者习惯于使用函数,而不必看到它们的实现。

一个独立函数的前向声明语法是什么?

{适用于C99和C ++}

顺便说一句,我正在使用设置为使用C99的IAR Workbench C编译器。

3个回答

25

与非内联函数没有区别:

void func();       // "forward" declaration

// ...

inline void func() // definition
{
    // impl
}

通常用于“隐藏”库使用者不需要访问的定义,是将声明放在一个头文件(a.h)中,将定义放在第二个头文件(a_def.h)中,然后在前者中#include后者(为简洁起见省略了包含保护):

// a.h
void func();
#include "a_def.h"

// a_def.h
inline void func()
{
    // impl
}

库的使用者只需简单地 #include <a.h>


如果定义只隔了一个文件,它们是如何隐藏的?如果我在同一文件中将定义放在声明下面,是否有任何区别? - Fabian
@Fabian: “Hide” 用引号括起来是有原因的。;-] 不,完全没有区别。 - ildjarn
3
对于 C99,这是不正确的。在非内联声明和内联定义一起使用时,会在每个包含该头文件的翻译单元中发出一个外部可见符号,导致链接失败并出现重复符号错误。 - a3f
2
@a3f:已经注意到了,这个答案是针对C++的。(这就是为什么在一个问题上打上多种语言标签是愚蠢的原因。) - ildjarn

3

您不需要“前向声明”它(这个术语通常只适用于类型,因为我们通常在第一次声明它们的地方就定义了它们)。

只需像平常一样声明它:

#include <iostream>

void foo();            // Declaration

inline void foo() {    // Defining declaration
   std::cout << "!";
}

// ---------------------------------------------

int main() {
   foo();              // Output: foo()
}

在线演示。


2
也许我在问题中没有表述清楚,使用前向声明来定义内联函数是否会有任何问题? - Thomas Matthews
1
@ThomasMatthews:你要求语法。但我的回答已经涵盖了你的新问题。正如它所说,不要称其为“前向声明”。 - Lightness Races in Orbit
1
在C++中实际上没有“前向声明”这个术语,只有“声明”。 - Kerrek SB
1
@KerrekSB:标准章节27.3的标题与您(以及赞同您不正确评论的人)不符。为了节省您查找的时间,它称为“前向声明”,并列出了iostreams中的前向声明。希望这可以帮助您。 - Lightness Races in Orbit
2
@KerrekSB: 还有9.1/2: "[..] 仅由_class-key identifier;_组成的声明是当前作用域中名称的重新声明或标识符作为类名称的前向声明。它将类名引入当前作用域。[..]"这是规范化的。 - Lightness Races in Orbit
显示剩余2条评论

1
为了同时使用C++和C99,请将声明也设置为inline,像这样:
// declaration
inline void foo(void);

// implementation 
inline void foo(void) {
    print("foo");
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接