我有一个函数,它最初在头文件my.h中声明为具有外部链接(没有指定存储类)
int myfunc(int);
此函数定义及其调用存在于源文件my.c中 my.c包括my.h
一切都很好。
但是现在我想把这个函数myfunc内联 所以我在my.c中声明了一个新的原型
as
__attribute__((always_inline)) static inline int myfunc(int)
并以与之前相同的功能定义它,
如预期的那样我一直收到错误
静态声明' myfunc'遵循非静态声明
我需要为C参考版本的代码保留此函数的非静态非内联版本,并为代码的优化版本保留静态内联版本。
我如何解决这个问题,因为我需要该函数的静态声明。在这个现有的源/头文件设置中我有
一种方法是将静态内联函数的名称更改为myfuncinline并使用它!
但目前的设置是否有任何方法。
答案 0 :(得分:2)
使用静态存储类说明符定义的函数具有内部链接。您不能在该翻译单元之外引用它。
如果你不能在标题中更改myfunc的声明,那么写两个 源文件中的函数。一个名为myfuncreal,它执行所有工作并使用静态内联定义:
__attribute__((always_inline)) static inline int myfuncreal(int a)
{
//uses parameter a and returns the result
}
另一个叫myreal,包裹着myfuncreal,定义为:
int myfunc(int a)
{
return myfuncreal(a);
}
答案 1 :(得分:0)
#ifndef DEBUG
static inline
#endif
int myfunc(int);
假设在调试版本中定义了DEBUG,而在优化版本中没有定义。请注意,此示例适用于.c文件中的声明或.h文件中的定义;对于.h 中的声明和<。em>
中的定义/* foo.h */
#ifdef DEBUG
int myfunc(int);
#endif
/* foo.c */
#ifndef DEBUG
static inline int myfunc(int);
#endif
/* code that uses myfunc() */
#ifndef DEBUG
static inline
#endif
int myfunc(int) {/* definition */}