static
и extern
наклеивает ограниченные по объему файлом переменные, определяют, доступны ли они в других единицах перевода (т.е. другой .c
или .cpp
файлы).
static
дает переменную внутреннюю связь, скрывая его от других единиц перевода. Однако переменные с внутренней связью могут быть определены в нескольких единицах перевода.
extern
дает переменную внешнюю связь, делая его видимым к другим единицам перевода. Обычно это означает, что переменная должна только быть определена в одной единице перевода.
значение по умолчанию (когда Вы не определяете static
или extern
) является одной из тех областей, по которым отличаются C и C++.
В C, ограниченные по объему файлом переменные extern
(внешняя связь) по умолчанию. Если Вы используете C, VAL
static
, и ANOTHER_VAL
extern
.
В C++, ограниченные по объему файлом переменные static
(внутренняя связь) по умолчанию, если они const
, и extern
по умолчанию, если они не. Если Вы используете C++, и VAL
и ANOTHER_VAL
static
.
Из проекта спецификация C:
6.2.2 Связи идентификаторов...-5-, Если объявление идентификатора для функции не имеет никакого спецификатора класса памяти, его связь определяется точно, как будто оно было объявлено с экстерном спецификатора класса памяти. Если объявление идентификатора для объекта имеет объем файла и никакой спецификатор класса памяти, его связь является внешней.
Из проекта спецификация C++:
7.1.1 - Спецификаторы класса памяти [dcl.stc]...-6-имя, объявленное в объеме пространства имен без спецификатора класса памяти, имеет внешнюю связь, если это не имеет внутреннюю связь из-за предыдущего объявления и если это не объявляется константой. Objects объявил, что константа и не явно объявленный экстерн имеет внутреннюю связь.
В прошлый раз, когда я работал над массовым веб-сайтом, мы сделали несколько вещей, в том числе:
Если вы хотите быстро взглянуть, скажите в первом приближении, я '