Как инициализировать глобальную переменную только для заголовка в C - PullRequest
1 голос
/ 14 февраля 2012

У меня есть функция, определенная в библиотеке только для заголовка, которая выглядит следующим образом:

inline bar **foo_ptr() {
    static bar *value = NULL;
    return &value;
}

Это мой хакерский способ инициализации глобальной переменной без определения ее в файле * .c.

Это прекрасно скомпилируется в VS2010 (после #define inline __inline), но умирает от ярости множественного определения при любой попытке скомпилировать его в MinGW. Это делает меня очень грустным.

AFAIK, я не могу просто использовать функцию static inline, так как она создаст многократные значения, что для этой ситуации является очень плохой вещью.

Какое ключевое слово (а) я должен действительно использовать, чтобы сделать эту работу? Я иду на это совершенно неправильно? Есть ли альтернативный способ инициализации глобальной переменной только для заголовка в NULL?

Я бы предпочел держаться подальше от методов init.

Спасибо: D

Ответы [ 2 ]

1 голос
/ 14 февраля 2012

Стандарт C99 говорит в разделе §6.7.4 Спецификаторы функций:

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

Ваша функция в настоящее время пытается вернуть указатель на локальную переменную;это хорошо известно нет-нет.Но стандарт запрещает вам изменять эту переменную в статическую.Если бы существовала внешняя переменная value, то ее можно было бы заставить работать, вроде.Но это, вероятно, противоречит цели, которую вы пытались достичь:

extern bar *value;

inline bar **foo_ptr() {
    value = NULL;
    return &value;
}

Но переменная должна быть объявлена, чтобы она была доступна.Это также должно быть определено где-то.Честно говоря, вам будет лучше просто признать, что если вам нужна глобальная переменная, лучше всего использовать (объявить, определить) ее.

0 голосов
/ 15 февраля 2012

Что ж, я собираюсь ответить на свой вопрос здесь, но все зависит от Джейсона Коко (если вы захотите сделать свой собственный ответ, я с радостью приму это вместо этого).

В любом случае - решение было просто объявить глобальную переменную без ее инициализации. Компилятор автоматически установит для него значение null.

bar *foo;

Проблема решена:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...