C ++: внешние и встроенные функции - PullRequest
5 голосов
/ 24 июля 2010

У меня есть пара файлов, написанных на C, и я хочу, чтобы они были C ++ -совместимыми, поэтому для своих заголовков C я использую;

#ifdef __cplusplus
extern "C" {
#endif

в начале файла и, конечно,

#ifdef __cplusplus
}
#endif

... в конце.Но, похоже, это создает проблемы с ключевым словом inline.Мое решение состоит в том, чтобы просто удалить ключевое слово inline для C ++, но я полагаю, что это может плохо сказаться на программах на C ++ (эти функции называются миллиардами раз).

Ответы [ 2 ]

2 голосов
/ 24 июля 2010

Если я правильно понимаю, я бы сделал:


 #ifdef __cplusplus
 #define D_INLINE static
 extern "C" {
 #else
 #define D_INLINE inline
 #endif

И используйте D_INLINE для функций, которые, я думаю, должны быть встроенными. Как сказал Делнан, компилятор все равно оптимизирует его, а ключевое слово inline - всего лишь подсказка компилятору, что программист считает, что компилятор должен встроить функцию. Это не заставляет компилятор встроить функцию.

0 голосов
/ 24 июля 2010

Встроенные функции, как ожидается, будут многократно определены, поэтому:

#ifdef __cplusplus
extern "C" {
#elif __STDC_VERSION__ >= 199901L
   /* do nothing, C99 supports inline */
#else
#  define inline static
#endif

Многие компиляторы C имеют нестандартные расширения для пометки функций как встроенных, вы также можете определить их как __attribute__((always_inline)) (если __GNUC__ определено)

РЕДАКТИРОВАТЬ: Для лучшего и более полного совета см .: http://www.greenend.org.uk/rjk/2003/03/inline.html

...