Как иметь встроенные функции в нескольких файлах - PullRequest
0 голосов
/ 03 февраля 2020

Мой проект имеет следующие 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 */
}

queue.c` выглядит так:

#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, компилируется нормально.

1 Ответ

1 голос
/ 03 февраля 2020

inline Queue* init( int n );

Чтобы компилятор мог встроить функцию, он должен знать код функции. Без этого знания компилятор должен передать вызов этой функции 1 . Отсюда и предупреждение. Чтобы использовать встроенную функцию в нескольких модулях, вы можете определить ее в заголовке как:

static inline Queue* init (int n)
{
    /* code here */
}

Cf. например, документация G CC для inline.

Причина предупреждения состоит в том, что вы хотите, чтобы функция была встроенной, но вы скрываете код от компилятора: main.c включает заголовок, который объявляет встроенную функцию, но в этом модуле компиляции, init не определен (реализован) нигде. 1 За исключением функций, встроенных в компилятор. В этом случае вам не нужно предоставлять код самостоятельно, он имеет встроенные знания об этом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...