Странное поведение с gcc и inline - PullRequest
0 голосов
/ 18 декабря 2018

Я хочу определить встроенную функцию в заголовочном файле (.h), который может быть включен в многочисленные исходные файлы (.c).Вот минимальный пример с 1 заголовком и 2 исходными файлами:

Заголовочный файл foo.h

int ifunc(int i);

extern inline
int
ifunc(int i)
{
  return i + 1;
}

Исходный код файла: foo.c

#include <stdio.h>
#include "foo.h"

int foo2(int i);

int main()
{
  printf("%d\n", foo2(1));
  return 0;
}

Файл исходного кода foo2.c

#include "foo.h"
int foo2(int i)
{
  return ifunc(i);
}

Проблема

Когда я компилирую соптимизация,

gcc -g -Wall -O2 -o foo foo.c foo2.c
$ ./foo
2

все отлично работает.Однако, когда я отключаю оптимизацию, я получаю эту ошибку:

gcc -g -Wall -o foo foo.c foo2.c
/tmp/cc3OrhO9.o: In function `foo2':
foo2.c:5: undefined reference to `ifunc'

Может кто-нибудь объяснить, как это исправить, чтобы я мог запустить код с и без -O2?Я использую gcc 4.8.5.

1 Ответ

0 голосов
/ 19 декабря 2018

если вы замените foo.h на

static inline int ifunc(int i)
{
  return i + 1;
}

Оба будут работать.Объявление его extern означает, что оно будет определено где-то еще, чего в вашем исходном примере не происходит.И оптимизированная сборка не помечается как ошибка, потому что она уже оптимизировала ее, чтобы встроить ее, но неоптимизированная сборка не находит определения ни в одном из файлов .o (так как все они были скомпилированы с ifunc является extern, как определено в foo.h).

Объявление статическим встроенным гарантирует, что он будет локальным для каждого файла (недостатком является то, что если он не будет встроен, вы получитедля каждого .o, для которого требуется, иметь локальную копию, поэтому не переусердствуйте).

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