Как это происходило, что “статичный” обозначает функцию/переменную без внешней связи в C и C++?

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

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

8
задан Gregory Pakosz 6 May 2010 в 11:14
поделиться

4 ответа

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

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

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

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

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

4
ответ дан 5 December 2019 в 09:24
поделиться

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

Рассмотрим следующее:

void func() {
    static int x;
}

против

int x;
void func() {
}

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

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

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

6
ответ дан 5 December 2019 в 09:24
поделиться

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

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

2
ответ дан 5 December 2019 в 09:24
поделиться

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

6
ответ дан 5 December 2019 в 09:24
поделиться