Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何在多个文件中使用内联函数_C_Gcc_Optimization_Linker_Inline - Fatal编程技术网

C 如何在多个文件中使用内联函数

C 如何在多个文件中使用内联函数,c,gcc,optimization,linker,inline,C,Gcc,Optimization,Linker,Inline,我的项目有以下4个文件:main.c、rcm.h、rcm.c和queue.c 在rcm.h中,我声明了在rcm.c和queue.c中实现的所有函数 rcm.c看起来像: #include "rcm.h" void rcm (void) { Queue *Q = init(10); /* Some other stuff */ } #include "rcm.h" extern inline Queue* init(int n) { return malloc(sizeof(

我的项目有以下4个文件:
main.c
rcm.h
rcm.c
queue.c

rcm.h
中,我声明了在
rcm.c
queue.c
中实现的所有函数

rcm.c
看起来像:

#include "rcm.h"

void rcm (void) {

  Queue *Q = init(10);

  /* Some other stuff */
}
#include "rcm.h"

extern inline Queue* init(int n) {
  return malloc(sizeof(Queue*);
}
queue.c`看起来像:

#include "rcm.h"

void rcm (void) {

  Queue *Q = init(10);

  /* Some other stuff */
}
#include "rcm.h"

extern inline Queue* init(int n) {
  return malloc(sizeof(Queue*);
}
rcm.h

#ifndef __RCM__
#define __RCM__

typedef struct queue { /*...*/ } Queue;

void rcm( void );

inline Queue* init( int n );
#endif
编译时,我会收到警告

 gcc-7 -O0 -c rcm.c -o rcm.o
 In file included from rcm.c:15:0:
 rcm.h:58:15: warning: inline function 'init' declared but never defined
 inline Queue* init(int size);
               ^~~~
 gcc-7    -c queue.c -o queue.o
 gcc-7 main.c lib/rcm.o queue.o -o main
In file included from main.c:4:0:
inc/rcm.h:58:15: warning: inline function 'init' declared but never defined
 inline Queue* init(int size);
           ^~~~
但是,当我不将
init()
声明为
inline
时,它会正常编译

内联队列*init(int n)

为了使编译器能够内联函数,它必须知道函数的代码。没有这些知识,编译器必须发出对该函数1的调用。因此发出警告。为了在多个模块中使用内联函数,您可以在标题中将其定义为:

静态内联队列*init(int n)
{
/*代码在这里*/
}
参考。例如

警告的原因是您希望函数是内联的,但您正在对编译器隐藏代码:
main.c
包含声明内联函数的头,但在该编译单元中,
init
未定义(实现)。
1编译器内置函数除外。在这种情况下,您不必自己提供代码,编译器有关于它的内置知识。

问题是:为什么要在翻译单元中声明内联函数
init()
,而不定义它?函数只能内联,如果定义存在于源代码中,则无法从其他转换单元内联。请在.h文件中声明内联函数(即包括代码)。