В моем коде на C я хочу выставить статические переменные через встроенные функции, и таким образом избежать использования атрибута «extern», типа ООП в стандартном C. Однако я не могу его скомпилировать. Рассмотрим следующий код:подвергая статическую переменную встроенной функции
[[email protected] snippets]$ cat object.h
inline int get_value(int index);
[[email protected] snippets]$ cat object.c
#include "object.h"
static int data_array[32];
inline int get_value(int index) {
return data_array[index];
}
[[email protected] snippets]$ cat app.c
#include "object.h"
void main(void) {
int datum;
datum=get_value(8);
}
[[email protected] snippets]$ gcc -c object.c
object.c:5:9: warning: ‘data_array’ is static but used in inline function ‘get_value’ which is not static
return data_array[index];
^
[[email protected] snippets]$ ls -l object.o
-rw-rw-r-- 1 niko niko 976 Aug 30 15:56 object.o
[[email protected] snippets]$ gcc -c app.c
In file included from app.c:1:0:
object.h:1:12: warning: inline function ‘get_value’ declared but never defined
inline int get_value(int index);
^
[[email protected] snippets]$ ls -l app.o
-rw-rw-r-- 1 niko niko 1368 Aug 30 15:56 app.o
[[email protected] snippets]$ gcc -o app app.o object.o
app.o: In function `main':
app.c:(.text+0xe): undefined reference to `get_value'
collect2: error: ld returned 1 exit status
[[email protected] snippets]$
Можно ли получить доступ к статическим переменным каким-то образом за пределами файла они были объявлены через функцию инлайн, которая будет встраиваются в каждом .c файле он используется? Конечно, я могу просто объявить переменную «EXTERN»:
extern int data_array[];
и ссылаться на него непосредственно, но я хочу сделать это с помощью функции для имитации ООП в C без накладных расходов на вызов функции.
C11 проект стандарт n1570: * 6.7.4 Функции спецификаторов 3 Инлайн определение функции с внешним связыванием не должен содержать определение понятия изменяемых объект со статикой или длительностью хранения потока и не должен содержать ссылку на идентификатор с внутренней связью. * – EOF
@EOF слишком плохо ... Интересно, как люди моделируют ООП в C сквозными встроенными функциями? единственной жизнеспособной альтернативой были бы макросы, я думаю ... – Nulik
Я не вижу, как макрос поможет в любом случае. Я не уверен, почему вы настаиваете на том, что функции являются встроенными. – EOF