什么存储类是函数内部的静态,为什么?

时间:2012-01-10 14:24:32

标签: c++ storage-class-specifier

如果我使用的是单例模式(是的,我知道 - 它们通常很糟糕)......我有一个像这样的实例函数:

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

什么存储类是instance

我正在阅读“由David R. Butenhof编写POSIX线程编程”,我遇到的文字说:

  

大多数情况下,您可能会在文件范围内使用extern或静态存储类声明条件变量,即在任何函数之外。如果它们被其他文件使用,它们应该具有普通(外部)存储类,如果它们仅在声明变量的文件中使用,则它们应该具有静态存储类。

由于这个静态在函数内部,它是自动的吗?或者由于静态关键词而使类不同?

如果我将'instance'变量移动到其文件中的静态和全局(不在任何函数中) - 我是否仍然可以将其引用到另一个文件,或者这不起作用?

3 个答案:

答案 0 :(得分:4)

instance有一个静态存储类,因为它符合static限定符,不具有automatic变量的本地范围。
在文件范围内声明的静态变量具有内部链接,您不能在不同的文件中使用它们 如果你想声明一个可以跨文件使用的全局变量,那么你需要使用extern来提供变量外部链接。

答案 1 :(得分:4)

我认为作者已经将存储持续时间和链接混为一谈,但建议使用哪些关键字是正确的。

您的函数范围变量instance具有静态存储持续时间。如果没有static关键字,则会有自动存储持续时间。

文件范围始终的对象具有静态存储持续时间(在C ++ 11中具有关键字thread_local的线程存储持续时间)。在文件范围使用static关键字为对象提供内部链接extern为其提供外部链接,它们不会影响存储持续时间。< / p>

描述具有“静态存储类”的东西是正确的,因为static是所谓的“存储类说明符”,但它不是整个故事,因为文件范围中static的含义与功能范围的含义不同。

您可以将具有静态存储持续时间的对象的引用传递给其他翻译单元的代码。它是否具有文件范围或功能范围并不重要,它的链接是什么并不重要。 “如果其他文件使用它们,它们应该具有正常(外部)存储类”只是意味着如果其他文件将通过名称​​引用,则全局需要外部链接,因为全局名称包含内部联系是指每个TU中的不同对象。从技术上讲,它是具有链接的名称,而不是对象。

答案 2 :(得分:1)

通常,在项目中使用单例模式,以便在该项目中只使用一个实例。像DB连接池生成器或配置。 Singleton按以下方式使用:将始终调用的实例在类中必须是static和private,类的构造函数必须是private,getInstance函数必须是public。 我们来看看:

/**
 * @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;
    }
}