2016-03-30 6 views
1

В настоящее время у меня есть подпрограммы и глобальные переменные, определенные выше моего main(). Я пытаюсь создать библиотеку в C. Могу ли я объявить глобальные переменные в файле заголовка?Вы определяете глобальные переменные в библиотеке C?

+0

http://stackoverflow.com/questions/1164167/variable-declaration-in-a-header-file – fukanchik

ответ

0

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

0

Там не должно быть никаких проблем, или вы можете объявить их в .c и использовать EXTERN в файле .h

+0

Смотрите теги! Это примерно C, а не C++. – Olaf

+0

Извините, я просто кодирую в C++, и именно поэтому я написал cpp вместо c, это не повод для голосования отрицательный –

+1

Ну, это так. Поскольку типичные компиляторы-интерфейсы, такие как gcc, будут вызывать компилятор C++. Что является другим языком и очень плохой идеей при компиляции кода C. Но дело не только в этом. Ваша рекомендация просто неверна (пожалуйста, поймите разницу между _declaration_ и _definition_ и что означает спецификатор 'extern'. Btw. Это похоже на C++. См. Комментарии и другие ответы. – Olaf

8

Могу ли я объявить глобальные переменные в файле заголовка?

Да, вы можете объявить свои глобальные переменные в файле заголовка. Однако это должны быть объявления, а не определения ваших глобальных переменных.

Другими словами, заголовок должен сказать

// This goes into the header 
extern int my_global_int; 

и файл C должен сказать

int my_global_int; 

Примечание: Тот факт, что вы можете сделать это не значит, что вы должен сделать это. Выявление «сырых» глобальных переменных из библиотеки является плохой практикой, потому что пользователи вашей библиотеки могут делать с ними неожиданные вещи.

Лучше было прятать свои глобалам, делая их static, и подвергая функции, чтобы управлять ими вместо:

// This goes into the header 
int get_global(); 
void set_global(int n); 

// This goes into the C file 
static int my_former_global; 

int get_global() { 
    return my_former_global; 
} 
void set_global(int n) { 
    if (<n-is-valid>) { 
     my_former_global = n; 
    } 
} 
0

Да, можно, но это плохая привычка; не делай этого .

+0

Надеюсь, вы имели в виду: «Это плохая привычка ** ___ ** сделать это». – Olaf

+0

нет, что я имел в виду, существует так много подходов в C для evreything, но есть некоторые standers, которые вы должны соблюдать, чтобы другие могли легко понять ваш код, это он^_ ^ –

1

Постарайтесь свести к минимуму использование глобальных переменных, поскольку они делают программу менее читаемой и более подверженной ошибкам. Библиотека должна использоваться через свой интерфейс (передача данных вперед и назад между функциями, которые она предоставляет), а не путем доступа к глобальным переменным.

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

Если по какой-то причине вам действительно нужна глобальная переменная, определите ее в файле кода (c-файл) и объявите ее как extern в файле заголовка.

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