Какой класс хранения является статическим внутри функции и почему? - PullRequest
0 голосов
/ 10 января 2012

Если я использую одноэлементный шаблон (да, я знаю - они обычно плохие) ... и у меня была функция экземпляра, например, так:

MySingleton* Instance() {
    static MySingleton instance;
    return &instance;
}

что такое класс хранения instance?

Я читаю "Программирование с использованием потоков POSIX Дэвида Р. Бутенхофа", и я наткнулся на текст, который говорит:

В большинстве случаев вы, вероятно, будете объявлятьусловные переменные, использующие внешний или статический класс хранения в области видимости файла, то есть вне какой-либо функции.У них должен быть нормальный (внешний) класс хранения, если они используются другими файлами, или статический класс хранения, если они используются только внутри файла, который объявляет переменную.

Поскольку этот статический объект находится внутри функцииэто авто?или класс отличается из-за статического ключевого слова?

Если бы я переместил переменную 'instance', чтобы она была статической и глобальной (не в любой функции) в ее файле - мог бы я все же дать ссылку на неедругой файл, или это не будет работать?

Ответы [ 3 ]

4 голосов
/ 10 января 2012

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

Ваша переменная области действия функции instance имеет статическую продолжительность хранения. Без ключевого слова static он будет иметь автоматическую продолжительность хранения.

Объект в области действия файла всегда имеет статическую длительность хранения (ну или длительность хранения потока в C ++ 11 с ключевым словом thread_local). Использование ключевого слова static в области действия файла дает объекту внутреннюю связь , extern дает ему внешнюю связь , они не влияют на продолжительность хранения.

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

Вы можете передавать ссылку на объект со статической длительностью хранения в код из других единиц перевода. Неважно, имеет ли он область видимости файла или функции, и не имеет значения, какова его связь. «У них должен быть нормальный (внешний) класс хранения, если они используются другими файлами», просто означает, что глобальному элементу нужна внешняя связь, если другие файлы будут ссылаться на него по имени , поскольку глобальное имя с внутренним Связь относится к другому объекту в каждом TU. Технически это имя имеет связь, а не объект.

4 голосов
/ 10 января 2012

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

1 голос
/ 10 января 2012

В общем случае шаблон Singleton используется в проектах, поэтому в этом проекте будет использоваться только один экземпляр. как генераторы пула соединений с БД или конфигурация. Singleton используется следующим образом: экземпляр, который будет вызываться всегда, должен быть статическим и закрытым в классе, конструктор класса должен быть закрытым, функция getInstance должна быть публичной Давайте посмотрим ниже:

/**
 * @author harzumanian
 *
 */
public class LogManager {

    private File file = null;
    private static LogManager logger = null;

    /**
     * 
     */
    private LogManager() {
        file = new File(Constants.PLUGIN_LOG);
    }

    public static LogManager getLogger() {
        if (logger == null) {
            logger = new LogManager();
        }
        return logger;
    }
}
...