Глобальные переменные и функции в C - PullRequest
0 голосов
/ 03 апреля 2012

Извините, это основной вопрос, но все мои исследования едва ли пропустили ответ на мой вопрос, и я просто хотел перепроверить, прежде чем писать весь свой код с предположением. Я использую C и у меня есть заголовочный файл с некоторыми объявленными переменными (int s, char массивы, int массивы). Если у меня есть функция, которая использует эти глобальные переменные, я предполагаю, что я могу использовать переменные, не передавая их?

Пример ФАЙЛ ГОЛОВКИ:

int state;
int lnArray[];

C ФАЙЛ:

void function(){ 
    int i;
    for(i=0;i<5;i++;){
        if(lnArray[i]<10)    
        state = lnArray[i];
    }
}

Ответы [ 5 ]

6 голосов
/ 03 апреля 2012

Обратите внимание, что ваш заголовочный файл, как написано, определяет глобальную переменную state (он объявляет неполный массив lnArray); следует просто объявить их:

extern int state;
extern int lnArray[];

Затем в одном из исходных файлов (исходный файл, который также включает в себя заголовок) вы пишете:

int state = 0;
int lnArray[XXX];   //  XXX is an enum or #define that gives the array size

Или вы можете иметь инициализатор для lnArray, который дает размер массива.

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

См. Также: Что такое внешние переменные в C?

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

3 голосов
/ 03 апреля 2012

Это верно. Вот почему они называются «глобальными» переменными: они доступны в любой области.

2 голосов
/ 03 апреля 2012

Пример, который вы привели, верен, но подвержен ошибкам «переобъявления» компоновщика.

Предпочтительный способ использования глобальных переменных:


/* example.h */
extern int state;
extern int lnArray[];

/* example.c */
int state;
int lnArray[SOME_SIZE_HERE];

Объявляя extern s в заголовочном файле, вы можете #include <example.h> столько раз, сколько пожелаете, из любого количества различных исходных файлов без повторного объявления state или lnArray.

1 голос
/ 03 апреля 2012

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

Применяется одно определение глобальногок одному файлу другой может применяться к нескольким файлам.

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

Если вы хотите, чтобы ваши переменные были глобальными для одного источникафайл, поместите их в верхнюю часть этого исходного файла и сделайте их статичными (фактически невидимыми для компоновщика):

static int state;

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

Однако, если вы хотите, чтобы ваши переменные были глобальными для всех исходных файлов, поместите объявление in файл заголовка и определение в одном исходном файле на языке C.Объявление объявляет, что что-то существует, в то время как определение создает его:

something.h:
    extern int state;                     // declare it

file1.c:
    #include "something.h"                // declare it (in header)
    int state;                            // AND define it.
    // Now you can use state anywhere.

file2.c:
    #include "something.h"                // declare it (in header)
    // Now you can use state anywhere.

Это означает, что есть одна копия state, к которой имеют доступ все файлы.


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

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

Если вы действительно не хотите передавать их, по крайней мере изолируйте все данные и код, который ими манипулирует, в один файл, чтобы вы могли скрыть это,способ.

1 голос
/ 03 апреля 2012

да, но будьте немного осторожнее, если вы планируете включить его в какой-то другой заголовок.

http://tread.wordpress.com/2007/06/18/declaring-global-variables-in-header-files/

Являются ли глобальные переменные плохими?

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