内联静态函数的声明

时间:2016-05-19 21:06:05

标签: c c99

对于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关键字?

1 个答案:

答案 0 :(得分:1)

这是根据6.2.2 / 7的未定义行为:

  

如果在翻译单元中,同一标识符同时显示内部和外部链接,则行为未定义。

inline int foo(int x);行声明foo具有外部链接(6.2.2 / 5),但static int foo(int x) {声明foo具有内部链接。

如果你真的想这样做,那么foo_decl.hfoo_def.h中的版本必须都有static,或者都没有static。在后一种情况下,只有一个.c文件必须具有extern inline int foo(int x);