2016-04-06 4 views
3

В GNU's getopt_long example, static используется флаг, определенной в области файла:Какова цель статичности здесь?

/* Flag set by ‘--verbose’. */ 
static int verbose_flag; 

и в long_options структуры, определенной в блоке сферы в while петли:

static struct option long_options[] 

Is static используется здесь, чтобы другие файлы не могут получить доступ к переменным? Является ли static таким же образом в обоих случаях, и эффективнее ли он в структуре, потому что он хранится в одном и том же месте памяти, а не повторно инициализируется?

ответ

2

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

То же самое касается функций. Если функция в C статична в файле, ее можно использовать только в этом файле, а не в других файлах.

Так что да, я предполагаю, что это запрещено использовать его в других файлах.

+2

Это только покрывает 'verbose_flag', обратите внимание, что' long_options' немного отличается ... – hyde

0

Ну, когда статичность появляется из любого блока кода в файле C/C++, это модификатор объявления указывает, что эта переменная не может быть доступна другим файлом; когда static появляется в блоке кода, он говорит, что эта переменная является «статической». verbose_flag подходит для первого, а long_options - в другом.

+1

Лучше говорить о единицах перевода, чем о файлах. Модуль перевода в основном остается после препроцессора, поэтому он также имеет код из всех файлов .h. И декларация 'static' в файле .h создает независимую копию вещи в каждой единицы перевода, где этот файл .h был включен. Поэтому неточно/вводящим в заблуждение сказать «не может быть доступ к другому файлу». – hyde

+1

@hyde Почему бы вам не написать свой собственный ответ? Конечно, предлагая улучшения, это хорошо, но комментарии не помогают самой дискуссии. – edmz

+0

Ответ @black dkg кажется достаточно хорошим сейчас. – hyde

0

Я сделаю это в обратном порядке:

static struct option long_options[] 

используется для опции переменная объявляется один раз и навсегда, независимо, сколько раз будет выполняться цикл while.

Но вы должны увидеть его в целом (извлеченную из вашей ссылки):

... 
while (1) 
{ 
... 
static struct option long_options[] = 
    { 
     /* These options set a flag. */ 
     {"verbose", no_argument,  &verbose_flag, 1}, // <-- IMPORTANT HERE ! 
     {"brief", no_argument,  &verbose_flag, 0}, // <-- IMPORTANT HERE ! 
     /* These options don’t set a flag. 
     We distinguish them by their indices. */ 
     {"add",  no_argument,  0, 'a'}, 
     {"append", no_argument,  0, 'b'}, 
     {"delete", required_argument, 0, 'd'}, 
     {"create", required_argument, 0, 'c'}, 
     {"file", required_argument, 0, 'f'}, 
     {0, 0, 0, 0} 
    }; 
... 
} 
... 

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

+1

'verbose_flag' находится в области файлов, поэтому он не потеряет значение между итерациями даже без' static'. Это сделано 'static' по другой причине ... – hyde

+0

@hyde Я собирался прокомментировать то же самое – qwr

+0

@hyde да, вы правы, то это делается для того, чтобы переменная была полностью локальной для этого файла, гарантируя, что нет использовать из других файлов. – dkg

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