我的库包含一个内部和外部使用的函数。该函数非常小,我希望编译器在调用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)?
答案 0 :(得分:5)
根据C99规则,这看起来完全没问题。因为stack.c
是使用函数的extern
和inline
声明编译的,所以它将使用外部链接定义,也可以在该文件中内联。
其他文件只有声明,因此将链接到具有外部链接的版本。
请注意,不允许该函数定义具有静态存储持续时间的任何可修改对象,或引用任何非extern
的函数或全局变量。