Интересно об использовании static
ключевое слово как ограничение объема для переменных в файле, в C.
Стандартный способ создать программу C, поскольку я вижу его, к:
static
.Я вижу два основания для объявления gobal как static
, если переменная не публикуется в h файле так или иначе:
extern
. Я предполагаю, что компоновщику не понравилась бы переменная, являющаяся обоими extern
и static
. (Мне не нравится идея файла, повторно объявляя переменную, принадлежавшую кому-то еще как extern
, в порядке это практика?)Какая-либо другая причина?
То же идет для static
функции. Если прототип не публикуется в h файле, другие файлы не могут использовать функцию так или иначе, итак, почему определяют его static
вообще? Я вижу те же две причины, но не больше.
Когда вы говорите об информировании других читателей, считайте сам компилятор читателем. Если переменная объявлена статической
, это может повлиять на степень включения оптимизаций.
Переопределение статической
переменной как extern
невозможно, но компилятор (как обычно) даст вам достаточно веревки, чтобы повеситься.
Если я напишу static int foo;
в одном файле и int foo;
в другом, они будут считаться разными переменными , несмотря на то, что имеют одинаковое имя и type - компилятор не будет жаловаться, но вы, вероятно, очень запутаетесь позже, пытаясь прочитать и / или отладить код. (Если я напишу extern int foo;
во втором случае, это не удастся связать, если я не объявлю нестатический int foo;
где-то еще.)
Глобальные переменные редко появляются в файлах заголовков, но когда они появляются, они должны быть объявлены extern
. В противном случае, в зависимости от вашего компилятора, вы рискуете, что каждый исходный файл, который включает этот заголовок, будет объявлять свою собственную копию переменной: в лучшем случае это вызовет сбой ссылки (множественно определенный символ), а в худшем - несколько сбивающих с толку случаев затенения.
Объявляя переменную static
на уровне файла (static
внутри функции имеет другое значение), вы запрещаете другим единицам доступа к ней, например, если вы попытаетесь использовать переменную внутри другой единицы (объявленной с помощью extern
), компоновщик не найдет этот символ.
Если глобальная переменная объявлена статической, компилятор иногда может сделать лучшую оптимизацию, чем в противном случае. Поскольку компилятор знает, что к переменной нельзя получить доступ из других исходных файлов, он может сделать лучшие выводы о том, что делает ваш код (например, "эта функция не изменяет эту переменную"), что иногда может привести к более быстрой генерации кода. Очень немногие компиляторы/линкеры могут выполнять подобные оптимизации в различных единицах трансляции.
Мое любимое использование статики - это возможность хранить методы, которые мне не придется внедрять или создавать объект для использования, как я это вижу, частные статические методы всегда полезны, а публичные статические методы требуют больше времени на обдумывание того, что вы делаете, чтобы избежать того, что crazyscot определил как "слишком много веревки и случайное повешение"!
Мне нравится держать папку для Helper классов для большинства моих проектов, которые в основном состоят из статических методов, чтобы делать вещи быстро и эффективно на лету, никаких объектов не нужно!
Когда вы объявляете статическую функцию, вызов функция является «ближним вызовом» и теоретически работает лучше, чем «дальний вызов». Вы можете погуглить для получения дополнительной информации. Это я нашел с помощью простого поиска в Google.