Во-первых, как говорит Чарльз в своем комментарии, вы не должны этого делать, C и C ++ - это существенно разные языки. В частности, их правила для inline
функций различны. Это причинит вам боль.
Тогда у вас есть еще один недостаток дизайна. Это очевидно, поскольку вы пытаетесь переопределить макрос. У вас есть два разных контекста для вашего INLINE
, поэтому они представляют две разные вещи. Я думаю, что следующая модель намного проще и прямолинейнее:
- используйте
inline
для заголовочных файлов. нет макроса или чего-то в этом роде
- в одном файле C или C ++ поместить «экземпляр» для той же функции
Вы должны решить, является ли ваш экземпляр C или C ++, не играйте в игры здесь. В C такой экземпляр является
extern inline Uint8 my_inline_function( Uint8 stuff );
(C не вызывает этот экземпляр, но давайте просто использовать тот же термин, что и C ++)
в C ++ это будет
Uint8 my_inline_function( Uint8 stuff );
Вот и все, магия не нужна:
- все модули компиляции, которые включают файл заголовка, будут иметь
определение доступно
- для всех ситуаций, где вам все еще нужен символ компоновщика
будет использоваться экземпляр
Edit:
Видя ваш комментарий (который не убеждает меня полностью), я думаю, вам будет лучше, если у вас будет один макрос для экземпляра в заголовочном файле
#ifdef __cplusplus
# define INSTANT
#else
# define INSTANT extern inline
#endif
и затем в одном .c или .C или что-то еще, что вам понадобится, чтобы убедить компилятор
INSTANT Uint8 my_inline_function( Uint8 stuff );