Zgodne definicje funkcji inline dla C99 i C ++

Mam bibliotekę narzędziową kodu C99 używaną przez kod aplikacji C ++ 11. Kilka funkcji wbudowanych jest zadeklarowanych w stylu C99 z kodem jawnie wygenerowanym w jednostce tłumaczeniowej, takim jak:

// buffer.h
inline bool has_remaining(void* obj) {
...
}

// buffer.c
extern inline bool has_remaining(void * obj);

Jednak kiedy próbuję użyćhas_remaining w aplikacji C ++ otrzymuję błędy dotyczące wielu definicji w czasie łącza. Wydaje się, że g ++ tworzy kod inline, który już istnieje w bibliotece, pomimoextern "C" osłony hełmu specyficzny.

Czy istnieje sposób zmuszenia g ++ do pracy z tym typem definicji?

Wygląda na to, że ja#ifdef __cplusplus definicja zewnętrzna zgnu_inline atrybut, właściwa rzecz się wydarzy, ale na pewno istnieje bardziej przenośny sposób na zachowanie nowoczesnych nagłówków C kompatybilnych z nowoczesnym C ++?

- Edytuj: Przykład pracy -

buffer.h:

#ifndef BUFF_H
#define BUFF_H

#include <stdbool.h>
#include <stddef.h>

#ifdef __cplusplus
extern "C" {
#endif

inline bool has_remaining(void const* const obj) {
    return (obj != NULL);
}

#ifdef __cplusplus
}
#endif

#endif /* BUFF_H */

buffer.c:

#include "buffer.h"

extern inline bool has_remaining(void const* const obj);

app.cpp:

#include <stdlib.h>
#include <stdio.h>

#include "buffer.h"

int main(int argc, char** argv) {
  char const* str = "okay";
  printf(str);

  has_remaining(str);

  return (0);
}

skompilować:

$ gcc -std=gnu99 -o buffer.o -c buffer.c
$ g++ -std=gnu++11 -o app.o -c app.cpp
$ g++ -Wl,--subsystem,console -o app.exe app.o buffer.o

buffer.o:buffer.c:(.text+0x0): multiple definition of `has_remaining'
app.o:app.cpp:(.text$has_remaining[_has_remaining]+0x0): first defined here
collect2.exe: error: ld returned 1 exit status

- Edycja 2-- The__gnu_inline__ atrybut naprawia problem wielu definicji. Nadal chciałbym zobaczyć (bardziej) przenośne podejście lub pewne rozstrzygające uzasadnienie, dlaczego jedno nie istnieje.

#if defined(__cplusplus) && defined(NOTBROKEN)
#define EXTERN_INLINE extern inline __attribute__((__gnu_inline__))
#else
#define EXTERN_INLINE inline
#endif

EXTERN_INLINE bool has_remaining(void const* const obj) {
  return (obj != NULL);
}

questionAnswers(3)

yourAnswerToTheQuestion