如何在C99中定义一个内联内部和外部副本的函数

时间:2010-08-25 12:57:48

标签: c inline c99 linkage

我的库包含一个内部和外部使用的函数。该函数非常小,我希望编译器在调用internal时尝试内联函数。因为函数使用不完整类型的信息,所以外部调用无法内联。所以我的模块也应该总是包含一个带有外部链接的函数的副本。

我想我找到了以下解决方案,但希望得到您的建议:

/* stack.h */
struct stack;
extern bool stack_isempty(struct stack *s);

/* stack.c */
#include "stack.h"
struct stack { [...]; int size; };
inline bool stack_isempty(struct stack *s) { return s->size == 0; }

通常我反过来使用内联或仅在头文件中放置static inline函数。但正如所解释的那样,这里不可能。

这种方法是否能产生预期效果?有没有人看到这种方法的任何缺点(它是便携式C99)?

1 个答案:

答案 0 :(得分:5)

根据C99规则,这看起来完全没问题。因为stack.c是使用函数的externinline声明编译的,所以它将使用外部链接定义,也可以在该文件中内联。

其他文件只有声明,因此将链接到具有外部链接的版本。

请注意,不允许该函数定义具有静态存储持续时间的任何可修改对象,或引用任何非extern的函数或全局变量。