Статическое встроенное определение приватной операции в приватном заголовке - PullRequest
0 голосов
/ 09 мая 2019

У меня есть публичный заголовок, содержащий непрозрачное объявление структуры и некоторую функцию для работы со структурой. Вот как это выглядит pub.h:

typedef struct ns_struct ns_struct;

ns_struct * ns_struct_allocate(void);

void ns_struct_release(ns_struct *);

//other declarations

Мне нужно определение struct ns_struct, которое будет использоваться в нескольких частных заголовочных файлах / c. Поэтому я создал специальный закрытый заголовок, содержащий его определение. Я также хочу предоставить дополнительную частную операцию. ns_struct.h

#include "pub.h"

struct ns_struct{
    size_t sz;
    void *mem;
    int counter;
};

static inline void ns_struct_resize(size_t new_size, struct ns_struct*){
     //...
}

Проблема, которую я вижу, заключается в том, что ns_struct_resize добавляется к общедоступному API и случайно забывается быть нестатичным, чем у нас есть идентификатор ns_struct_resize с внутренней и внешней связью в одной и той же единице перевода, вызывающей неопределенное поведение.

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

Что может быть другим способом справиться с таким делом?

...