Почему extern не будет ссылаться на статическую переменную?



почему extern int n не компилируется при объявлении n (в другом файле) static int n, но работает при заявленных int n? (Оба эти объявления были в области файлов.)



в принципе, почему int n в области файла не то же самое, что static int n в той же области? Это только по отношению к Экстерн? Если да, то как насчет extern я пропустил?

541   4  

4 ответов:

вся и вся цель static Это объявить, что переменная private к исходному файлу, который объявлен в. Таким образом, он делает точно свою работу в предотвращении соединения от extern.

имейте в виду, что существует четыре варианта определения переменной области видимости файла:

  1. int blah = 0; - blah определяется в этом файле и доступен из других файлов. Определения в других файлах являются дубликатами и приведут к ошибки.
  2. extern int blah; - blah должен быть определен в другом месте и ссылается на этот файл.
  3. int blah; - это моральный эквивалент Фортрана COMMON. Вы можете иметь любое количество этих файлов, и все они разрешаются компоновщиком в один общий int. (*)
  4. static int blah; (необязательно с инициализатором) - это статика. Это полностью личное для этого файла. Это не видно для внешних в других файлах, и вы можете иметь много разных файлов что все объявляют static TYPE blah;, и они все разные.

для пуристов в аудитории:' file'=единица компиляции.

обратите внимание, что статические внутренние функции (не в области файла) еще более плотно ограничены: если две функции объявляют static int bleh = 0; даже в одном файле они не связаны.

(*): для тех из вас, кто не знаком: в обычном шаблоне одна единица компиляции должна определить глобальную переменную, а другие могут ссылаться на него. Он "живет" в этом блоке компиляции. В случае (3), выше, ни один файл (или все файлы) не определяет его. Если два файла говорят int blah = 0; компоновщик будет жаловаться на множественные определения. Если два файла говорят int blah; компоновщик бодро создает единый глобальный int и заставляет весь код ссылаться на него.

в стандарте C существует две области для переменных, объявленных вне функции. А static переменная видна только внутри блока компиляции (т. е. файла), который ее объявил, А нестатические переменные видны по всей программе. Ан extern объявление говорит, что местоположение переменной еще не известно, но будет отсортировано компоновщиком; он совместим с нестатическими переменными, но extern static - просто бред!

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

iv. c:2: 1: ошибка: несколько классов хранения в спецификаторах объявления Экстерн статические инт я; ^

Это то, что мы получаем при попытке extern статической переменной. Объявление extern static int i; - аналогично объявлению float int i; Вы не можете иметь float и int появляются в одном объявлении правильно? Точно так же вы не можете иметь extern и static в одном объявлении.

согласно документации MSDN:

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

http://msdn.microsoft.com/en-us/library/s1sb61xd (v=vs.80). aspx: июнь 2013

Comments

    Ничего не найдено.