由于早期非静态非内联函数的静态内联版本导致的错误

时间:2016-11-30 11:48:05

标签: c compiler-errors

我有一个函数,它最初在头文件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并使用它!

但目前的设置是否有任何方法。

2 个答案:

答案 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 */}