2012-02-14 2 views
1

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

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

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

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

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

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

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

спасибо: D

+2

_Why_ вам нужна глобальные переменный заголовок только? У вашего рабочего места есть какой-то корпоративный стандарт, ограничивающий количество файлов C, которые вы разрешили использовать? :-) – paxdiablo

+2

Почему бы просто не использовать глобальную переменную? Это то, что вы делаете, просто на самом деле запутанным образом. –

+0

@paxdiablo: Да. Я работаю над очень маленькой библиотекой, и кажется, что такой отход делает пользователь компилировать дополнительный файл c _just_ для одной переменной. В этом смысле мое рабочее место (My House) имеет корпоративный (My House Inc.) стандарт (стандарт My House) для этого проекта, ограничивающий количество файлов C до нуля. : D – YellPika

ответ

0

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

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

bar *foo; 

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

+0

Обратите внимание, что для стандарта C требуется одно определение переменной. Он отмечает общее расширение, которое допускает несколько предварительных определений, и до тех пор, пока не будет инициализировано почти одно из них, в тех системах, которые поддерживают общее расширение, вы будете в порядке. Но это не является строго стандартным. (См. Приложение J в стандарте C99: §J.5.11. Множественные внешние определения, если быть точным.) Пока вы знаете, что используете расширение, которое не поддерживается повсеместно, все в порядке. –

1

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

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

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

extern bar *value; 

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

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

Смежные вопросы