ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
22 ноября
431910 Топик полностью
Vit (11.08.2013 09:38, просмотров: 283) ответил mazur на Вопросы по переменным.
На пальцах Для переменной нужно ВЫДЕЛИТЬ МЕСТО в ОЗУ и это делается ОДИН раз в ОДНОМ месте, как правило в файле *.с. Это то, что называется "ОБЪЯВИТЬ". В объявлении переменной можно присвоить начальное значение. Если переменная нужна в другом файле, то её можно ОПИСАТЬ просто непосредственно перед использованием (для функции - вызовом), добавив перед типом и именем слово extern - extern type name (и не пытаться задать начальное значение). Но чаще применяется вынос такого описания в хедер - *.h, часто, но совсем необязательно, совпадающий по имени с именем файла *.с с объявлением, затем хедеры включаются в файлы *.с, что эквивалентно описанию перед использованием. Причем ничего особо страшного, если этих описаний в разных файлах полно - пока они одинаковы, особых проблем нет, разве что порядку никакого:) С функциями в Си ситуация несколько отличается от ассемблера - их не нужно в *.c файле объявлять PUBLIC (или как-то так), они по умолчанию extern, потому в хедерах обычно не пишут extern foo();, хоть и не возбраняется. Что касается static - в Си для переменных этот модификатор ограничивает область видимости - если переменная объявлена вне функции(блока), то её область видимости ограничивается концом файла, если внутри блока (после открывающей фигурной скобки), то концом блока (закрывающей фигурной скобкой). Зачем это делается - как пример - пишут три программиста свои программные модули и каждому нужна локальная переменная unsigned char * buf - имя маленькое, удобное, понятное. Но вспоминаем - для переменной нужно ВЫДЕЛИТЬ МЕСТО в ОЗУ и это делается ОДИН раз в ОДНОМ месте. Также возможны другие проблемы с пересечением имен (рекомендую почитать http://mirknig.com …ammirovanija_na_s.html). Потому добавление модификатора static избавляет от возможных проблем. При объявлении переменной static внутри функции(блока) с присвоением начального значения, важно понимать, что это присвоение будет выполнено только один раз - выглядит так, что выполнится при первом вызове функции (чаще это будет сделано вместе с начальной инициализацией до вызова main()). С использованием модификатора static для функций отдельный разговор. Как по мне, то у разных компиляторостроителей свои мурашки, потому каждый раз старые новости