Стандартные состояния C ++ 11 (3.2.3), которые:
Каждая программа должна содержать ровно одно определение каждой нестрочной функции или переменной, которая является odr-используемой в этой программе ; не требуется диагностика. Определение может явно отображаться в программе, оно может быть найдено в стандартной или определяемой пользователем библиотеке или (если необходимо), оно неявно определено (см. 12.1, 12.4 и 12.8). Встроенная функция должна быть определена в каждой единицы перевода, в которой она используется odr.
blockquote>C ++ также знает об extern + inline, но понимает это как «Встроенная функция с внешней связью должна иметь один и тот же адрес во всех единицах трансляции "(7.1.2)
Таким образом, extern + inline, поскольку вы используете его, является чистой функцией C99, и вам должно быть достаточно сделать что-то вроде:
#ifdef __cplusplus #define C99_PROTOTYPE(x) #else #define C99_PROTOTYPE(x) x #endif
И ссылайтесь в buffer.c:
// buffer.c C99_PROTOTYPE(extern inline bool has_remaining(void * obj);)
встроенная функция в заголовке для C ++ 11 в порядке и должна отлично работать без прототипов в стиле C99.