静态函数内的所有变量默认都是静态的吗?

3
static void Foo()
{
    int bar = 0;
}

默认情况下,bar 是静态的吗?标准对此有何规定?

3
不。只有在使用关键字时变量才是静态的。 - NathanOliver
1
一个静态函数只是将函数“局部化”,因此它不能被其他对象引用。换句话说,如果该函数在foo.cc中定义,bar.cc就无法调用该函数。 - Mustafa Ozturk
1
这个问题证明了重用关键字 static 来隐藏函数是一个值得怀疑的想法。也许,引入一个关键字 hidden 会是一个更好的方法。 - Sergey Kalinichenko
@dasblinkenlight,这只是证明OP没有好好读Stroustrup的书 :) - Jonathan Potter
@dasblinkenlight 这个问题让我在从C转向C++时花费了很长时间才解决:http://programmers.stackexchange.com/a/141897/98845 - Jonathan Mee
2个回答

8
不,C++ 中使变量静态的唯一方法是使用 static 关键字
例如,如果将 Foo 更改为:
static void Foo()
{
    int bar = 0;

    bar++;
    cout << bar << endl;
}

然后调用:

Foo();
Foo();

由于 bar 不是静态的,输出结果将为:

1
1

但如果您将 bar 声明为 static,就像这样:

static void Foo()
{
    static int bar = 0;

    bar++;
    cout << bar << endl;
}

你的输出实际上将是:

1
2


你的打印语句让我有点困惑。我一开始没明白为什么bar等于11 :-) - Evorlor
1
@Evorlor 现在你这么说,有点令人困惑。我已经编辑添加了一个 endl - Jonathan Mee

5
不,静态函数内的变量默认情况下是在自动存储器中分配的。
静态函数和静态变量代表不同的概念,在C和C++语法中使用相同的关键字。
将函数定义为 static 可以告诉编译器将其隐藏在其他翻译单元定义的函数之外。
将变量定义为 static 可以告诉编译器将该变量的数据放置在静态存储区中。
函数使用 static 与静态存储区没有任何关系。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接