对于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
关键字?
答案 0 :(得分:1)
这是根据6.2.2 / 7的未定义行为:
如果在翻译单元中,同一标识符同时显示内部和外部链接,则行为未定义。
第inline int foo(int x);
行声明foo
具有外部链接(6.2.2 / 5),但static int foo(int x) {
声明foo
具有内部链接。
如果你真的想这样做,那么foo_decl.h
和foo_def.h
中的版本必须都有static
,或者都没有static
。在后一种情况下,只有一个.c
文件必须具有extern inline int foo(int x);
。