Как мне правильно определить встроенную функцию, которая разыменовывает непрозрачный указатель в соответствии со стандартом C99? Допустим, я организовал программу в три файла:
opaq.h:
typedef struct Opaq Opaq;
Opaq* opaq_init(void* ptr, int size);
void opaq_free(Opaq* o);
inline int opaq_size(Opaq* o);
opaq. c:
#include <stdlib.h>
#include "opaq.h"
struct Opaq {
void* ptr;
int size;
};
Opaq* opaq_init(void* ptr, int size)
{
Opaq* o = malloc(sizeof(*o));
o->ptr = ptr;
o->size = size;
return o;
}
void opaq_free(Opaq* o)
{
free(o);
}
int opaq_size(Opaq* o)
{
return o->size;
}
main. c:
#include <stdlib.h>
#include "opaq.h"
int main(void)
{
Opaq* o;
int size;
o = opaq_init(NULL, 3);
size = opaq_size(o);
opaq_free(o);
return 0;
}
Я бы хотел, чтобы opaq_size
был встроен в main. c . Насколько мне известно, такое встраивание возможно, так как встраивание может происходить во время связывания. Однако попытка скомпилировать это с помощью G CC дает следующее предупреждение:
$ gcc -Winline -o main main.c opaq.c
In file included from main.c:2:0:
opaq.h:5:12: warning: inline function ‘opaq_size’ declared but never defined
inline int opaq_size(Opaq* o);
Использование ключевого слова extern
в opaq.h дает такое же предупреждение. Компиляция с -fgnu89-inline
устраняет предупреждение, однако дизассемблирование main
показывает, что встраивание на самом деле не происходило. Обратите внимание, что я не могу определить функцию в заголовке (как static inline
), так как определение структуры выходит за рамки.