Как правильно встроить и использовать встроенную функцию в C99? (сборка не удалась) - PullRequest
7 голосов
/ 20 марта 2011

Выполнение cc -std=c99 example.c на следующем упрощенном example.c файле:

inline void a()
{
}

int main()
{
   a();

   return 0;
}

возвращает меня:

В функции `main ':
example.c:(.text + 0x7): неопределенная ссылка на 'a'
collect2: ld вернул 1 статус выхода

Как я понимаю, это связано с требованием стандарта C99 требовать ровно еще одногоопределение для каждой встроенной нестатической функции, которая используется в тех случаях, когда тело не может быть встроено?Если это так, я полагаю, что я мог бы сделать с static inline вместо этого, но я не хочу, чтобы это укусило меня позже, так что будет лучшим вариантом действий здесь?Очевидно, я хочу придерживаться C99, и я хочу встроить некоторые функции.(Да, я знаю, что компилятор обычно знает, что нужно встроить, не сообщая об этом, но у меня есть свои причины)

Ответы [ 2 ]

6 голосов
/ 20 марта 2011

Вероятно, у вас не будет этой ошибки при компиляции с -O2 или около того.

Определения встроенных функций должны идти в заголовочных файлах, а extern inline объявление должно идти в один блок компиляции.Do

inline void a(void){
 // empty
}

// in just one .c file
#include "the-file.h"
extern inline void a(void);

Кстати, объявление a без void не является прототипом.

0 голосов
/ 20 марта 2011

Прототипа функции нет, вот и все, поэтому сигнатура функции выводится неверно.Добавьте "void a ();"в начало файла, и все готово.

...