Если я правильно понимаю, что вы хотите, вы можете получить этот эффект, просто объявив глобальную переменную.
/*
* inc.h
*/
void* my_p;
static inline void* getPtr() {
if (!my_p) {
my_p = malloc(16);
}
return my_p;
}
При этом будет использоваться одна и та же переменная my_p
для всех случаев getPtr
на протяжении всего программа (так как она глобальная). И нет необходимости иметь явное определение my_p
в любом модуле. Он будет инициализирован до NULL
, что вам нужно. Таким образом, ничего кроме inc.h
не нужно менять, и дополнительный файл .c
не требуется.
Конечно, вы, вероятно, захотите дать my_p
имя, которое с меньшей вероятностью конфликтует с любым идентификатором. в программе пользователя. Может быть Sergios_include_file_p_for_getPtr
или что-то в этом роде.
На самом деле это расширение к стандарту C (упомянутое в Приложении J.5.11 в N2176), но оно предоставляется g cc и clang на большинстве современных платформ. Это задокументировано в опции компилятора -fcommon
(которая включена по умолчанию). Обычно это реализуется путем помещения переменной в секцию common
, и компоновщик затем объединяет все экземпляры вместе, как вы предлагаете. Но приведенный выше код показывает, как получить доступ к этой функции без необходимости использовать атрибуты или другие неясные заклинания.
Если вы хотите быть параноиком, вы можете объявить my_p
с помощью __attribute__((common))
, что приведет к изменению переменной относиться таким образом, даже если действует -fno-common
. (Конечно, это может вызвать проблемы, если -fno-common
использовался по причине ...)