продолжительность хранения функций, структур, классов, перечислений и объединений

0

Если глобальные переменные и объекты имеют статическую продолжительность хранения и внешнюю связь?

все ли функции имеют статичное время хранения и внешнюю связь?

как насчет структур и классов и счетчиков (имеет внешнюю связь, которую я знаю)/союзы?

Я полагал, что у них нет времени на хранение и нет связи, но тогда я думал, что (глобальные) функции имеют внешнюю связь по умолчанию, но в классе у них есть классная область, у них есть внутренняя связь или?

Теги:

2 ответа

2

Длительность хранения и связь - это не связанные понятия.

Функции не имеют "продолжительности хранения", так как функции не хранятся в памяти. Только объекты имеют продолжительность хранения. Типы также не хранятся в хранилище, поэтому типы не имеют продолжительности хранения.

Неправильно говорить, что классы вообще не связаны. Именованные классы, объявленные в области пространства имен, имеют внешнюю связь. Функции членов классов с внешней связью также имеют внешнюю связь. Классы, объявленные локально и безымянные классы, не имеют связей.

  • 0
    ну, я не имею в виду конкретно ... Я имею в виду, когда вы объявляете их в области видимости файла ... они не имеют права связывания?
  • 0
    Кто такие "они"? В любом случае, почти каждая именованная сущность (функция, объект, тип) в C ++, объявленная в области видимости файла, имеет внешнюю связь, если только она не объявлена как static (где это применимо).
Показать ещё 17 комментариев
0

Функции официально не имеют продолжительности хранения, но по существу они статичны (т.е. Каждая функция существует для всей продолжительности программы). Они имеют внутреннюю связь, если вы определяете их как static и внутри анонимного пространства имен, иначе внешние связи.

Класс хранения применяется к объекту, а не к определению типа, как класс, структура или объединение. Достаточно распространено иметь два объекта одного класса: один со статическим временем хранения, а другой - с продолжительностью автоматического хранения.

Аналогично, вы можете создать один объект с внутренней связью, а другой с внешней связью:

T x;
static T y;

То же самое касается связи классов:

class X { }; // external linkage

namespace { 
   class Y {}; // internal linkage
};

Ещё вопросы

Сообщество Overcoder
Наверх
Меню