4

我的库包含一个内部和外部都使用的函数。该函数是如此之小,以至于我希望编译器在调用内部函数时尝试内联函数。因为函数使用了不完整类型的信息,外部调用不能被内联。所以我的模块也应该始终包含具有外部链接的函数的副本。

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

/* 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; }

通常我会反过来使用 inline 或者只static inline在头文件中放置一个函数。但正如解释的那样,这在这里是不可能的。

这种方法是否给出了预期的结果?有没有人看到这种方法有任何缺点(它是便携式 C99)吗?

4

1 回答 1

5

根据 C99 规则,这看起来非常好。因为stack.c编译时使用了函数的 anexterninline声明,所以它将使用外部链接进行定义,也可以在该文件中内联。

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

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

于 2010-08-25T13:24:56.647 回答