Использование static в области файлов для ограничения доступа к текущему модулю перевода устарело в C ++, но все еще допустимо в C.
Вместо этого используйте безымянное пространство имен
namespace
{
int file_scope_x;
}
Переменные, объявленные таким образом, доступны только внутри файла, как если бы они были объявлены статическими.
Основная причина устаревания заключается в удалении одного из нескольких перегруженных значений статического ключевого слова.
Первоначально это означало, что переменной, такой как в функции, будет предоставлено хранилище для времени жизни программы в области для таких переменных, а не в стеке, как обычно для локальных переменных функции.
Затем ключевое слово было перегружено для применения к привязке области видимости файла. Не желательно создавать новые ключевые слова по мере необходимости, потому что они могут нарушить существующий код. Так что этот снова использовался с другим значением, не вызывая конфликтов, потому что переменная, объявленная как static, не может быть как внутри функции, так и на верхнем уровне, а функции не имели модификатора ранее. (Коннотация хранилища полностью теряется при обращении к функциям, поскольку они нигде не хранятся.)
Когда классы появились в C ++ (и в Java и C #), ключевое слово использовалось еще раз, но значение по крайней мере ближе к первоначальному замыслу. Переменные, объявленные таким образом, хранятся в глобальной области, а не в стеке, как для переменных функции, или в куче, как для членов объекта. Поскольку переменные не могут быть как на верхнем уровне, так и внутри определения класса, дополнительное значение может быть однозначно прикреплено к переменным класса. На них можно ссылаться только через имя класса или из объекта этого класса.