【问题标题】:declarations for inline static functions内联静态函数的声明
【发布时间】: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,这对于在标头中为函数提供可调用定义甚至至关重要。

标签: c c99


【解决方案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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-29
    • 2012-03-08
    • 2015-03-31
    • 1970-01-01
    • 1970-01-01
    • 2021-01-05
    • 1970-01-01
    相关资源
    最近更新 更多