Как определить функцию для встроенного внутреннего и внешнего копирования в C99 - PullRequest
4 голосов
/ 25 августа 2010

Моя библиотека содержит функцию, которая используется как внутренняя, так и внешняя.Функция настолько мала, что я хочу, чтобы компилятор пытался встроить функцию при вызове internal.Поскольку функция использует информацию неполного типа, внешние вызовы не могут быть встроены.Поэтому мой модуль также должен всегда содержать копию функции с внешней связью.

Я думаю, что нашел следующее решение, но хотел бы получить ваш совет:

/* stack.h */
struct stack;
extern bool stack_isempty(struct stack *s);

/* stack.c */
#include "stack.h"
struct stack { [...]; int size; };
inline bool stack_isempty(struct stack *s) { return s->size == 0; }

Обычно я использую встроенныйнаоборот или только поместите функцию static inline в заголовочный файл.Но, как объяснено, это невозможно здесь.

Дает ли этот подход желаемые результаты?Кто-нибудь видит какие-либо недостатки в этом подходе (это портативный C99)?

1 Ответ

5 голосов
/ 25 августа 2010

Это выглядит прекрасно в соответствии с правилами C99. Поскольку stack.c компилируется как с объявлением функции extern, так и inline, оно будет определено с помощью внешней ссылки и также может быть встроено в этот файл.

Другие файлы будут иметь только объявление, поэтому будут ссылаться на версию с внешней связью.

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

...