Как случилось, что «static» обозначает функцию / переменную без внешней связи в C и C ++? - PullRequest
8 голосов
/ 06 мая 2010

В C static может означать либо локальную переменную, либо глобальную функцию / переменную без внешней связи. В C ++ это также может означать переменную-член класса или функцию-член.

Есть ли какая-либо ссылка на то, как получилось, что ключевое слово static, которое кажется совершенно не относящимся к отсутствию внешней связи, используется для обозначения отсутствия внешней связи?

Ответы [ 4 ]

6 голосов
/ 06 мая 2010

Я предполагаю, что вы считаете естественным использование static для определения переменных, которые сохраняют свое значение между вызовами функций.

Обратите внимание на следующее:

void func() {
    static int x;
}

против

int x;
void func() {
}

С точки зрения func, x ведет себя одинаково в любом случае. Значение остается между последовательными вызовами. Разница между ними в том, кто еще может видеть x. Во первых никто не может. Во втором каждый может.

Эта концепция распространяется на статические переменные в глобальном масштабе. Если вы просто объявите переменную, все смогут ее увидеть. Но если вы объявите эту переменную статической, ее сможет увидеть только этот файл. Очевидно, вы должны учитывать тот факт, что нет дополнительных возможностей для ограничения видимости, но идея есть.

Дополнительное значение в C ++, касающееся статических членов, также прямо аналогично исходному примеру. Одна переменная, общая для всех экземпляров класса.

6 голосов
/ 06 мая 2010

Использование уже существующего ключевого слова имеет то преимущество, что не добавляет новое ключевое слово в язык, что может привести к поломке существующих программ. Это может сбивать с толку, но это считается своего рода "меньшим злом".

4 голосов
/ 06 мая 2010

static - спецификатор хранилища. Слово «статический» означает неизменное. «Хранение» относится к тому, где объект находится в памяти, то есть его адрес.

Объект с static хранится по постоянному адресу.

Просто так получилось, что объект с extern хранилищем также имеет постоянный адрес. Из-за того, как программы на C и C ++ связаны, это необходимо. И поскольку extern оказывается наименее удивительным поведением, это также значение по умолчанию.

Если вы думаете об этом с точки зрения extern как дополнительной функции поверх static, я думаю, что это имеет немного больше смысла. Немного глупо объявлять функцию static, поскольку в любом полностью скомпилированном языке нет альтернативы, но адрес функции является статическим, даже если он не виден снаружи.

Действительно несогласованная часть заключается в том, что члены класса, которые разделяются между различными блоками компиляции, должны быть объявлены static, а не extern

2 голосов
/ 06 мая 2010

Версия C означает «статически связанный» вне функции.

Версия класса C ++ и версии C внутри функций означают «статически хранимые», то есть они не являются auto (стековыми или локальными) переменными или переменными экземпляра в классах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...