【发布时间】:2016-05-19 21:06:04
【问题描述】:
对于 C99,将静态内联函数拆分为单独的声明和定义时,以下语法是否合法?
foo.h:
#include "foo_decl.h"
#include "foo_def.h"
foo_decl.h:
#ifndef _FOO_DECL_H
#define _FOO_DECL_H
/* Here we document foo */
inline int foo(int x);
/* Here we document bar */
inline int bar(int x, int y);
#endif // _FOO_DECL_H
foo_def.h:
#ifndef _FOO_DEF_H
#define _FOO_DEF_H
inline static int foo(int x) { return x+3; }
inline static int bar(int x, int y) { return x-y+22; }
#endif // _FOO_DEF_H
该声明对编译器来说确实没用,但它的目的是在一个地方收集函数的文档,而不会被散布的实现细节弄得一团糟。
或者foo_decl.h 是否应该包含static 关键字?
【问题讨论】:
-
static AND inline 应该放在
*.c文件中,你不需要在其编译单元之外声明静态签名,static 的全部意义在于它只在编译单元中可用它是编译出来的。 -
@self:实际上它取决于编译器,例如对于某些版本的 gcc,您需要在标头中添加
static inline,否则调试构建会由于链接时的多个定义而失败。 -
@self -- 根据 Paul R 的评论,目的是放入一个 .h 文件以包含在多个编译单元中。
-
@self
static inline在标头中是使代码与 ISO C 和 GNU C 兼容的唯一方法,see here for detail -
@JensGustedt:不是这样。哟可能要文档的功能是关键路径。如果没有
static,这对于在标头中为函数提供可调用定义甚至至关重要。