2010-08-25 60 views
4

我的库包含一个同时用于内部和外部的函数。该函数非常小,我希望编译器在调用internal时尝试内联函数。由于该功能使用不完整类型的信息,因此不能内联外部呼叫。所以我的模块也应该总是包含一个具有外部链接功能的副本。如何将函数定义为C99中的内联内部和外部副本

我想我找到了以下解决方案,但想你的建议:

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

虽然这个问题从语言的角度来看是有效的,但从实际的角度来看,'inline'对于编译器在内部调用时是否内联函数没有任何影响,所以你可以通过不使用它简化了你的代码。 – Leushenko 2017-08-03 09:59:40

回答

5

在C99规则下看起来非常好。因为stack.c是与externinline函数声明一起编译的,所以它将使用外部链接进行定义,并且也可以在该文件中内联。

其他文件只有声明,所以会链接到带有外部链接的版本。

注意,功能不允许限定任何修改的对象具有静态存储持续时间,或引用不extern任何功能或全局变量。

+0

谢谢。同时我想到了3个可能的问题,但它们都是无稽之谈:1.内联函数的定义和声明的顺序; 2.结构声明的联系; 3.用户提供自己的内联定义来“覆盖”我的内容。 – schot 2010-08-25 13:47:33

相关问题