C和C+中的静态变量+; 在C和C++之间的任何函数之外,声明为静态< /代码>的变量之间有什么区别。我读到,static意味着文件范围和变量在文件之外是不可访问的。我还了解到,在C语言中,全局变量是静态的。那么这是否意味着C中的全局变量不能在另一个文件中访问? < P>不,在这方面,C和C++之间没有区别。

C和C+中的静态变量+; 在C和C++之间的任何函数之外,声明为静态< /代码>的变量之间有什么区别。我读到,static意味着文件范围和变量在文件之外是不可访问的。我还了解到,在C语言中,全局变量是静态的。那么这是否意味着C中的全局变量不能在另一个文件中访问? < P>不,在这方面,C和C++之间没有区别。,c++,c,static,global-variables,C++,C,Static,Global Variables,了解静态在C程序中的含义。在C++中,有一些与使用静态< /代码>有关的类变量(而不是实例变量)。 关于全局变量是静态的,仅从内存分配的角度来看(它们是在数据段上分配的,就像所有全局变量一样)。从可视性的角度来看: static int var; // can't be seen from outside files int var; // can be seen from outside files (no 'static') 这里有两个概念“静态链接(或范围)”和

了解
静态
在C程序中的含义。在C++中,有一些与使用<代码>静态< /代码>有关的类变量(而不是实例变量)。 关于全局变量是静态的,仅从内存分配的角度来看(它们是在数据段上分配的,就像所有全局变量一样)。从可视性的角度来看:

static int var;    // can't be seen from outside files
int var;           // can be seen from outside files (no 'static')

这里有两个概念“静态链接(或范围)”和静态分配”


函数外关键字是指链接,内部指的是分配。函数外的所有变量都隐含地有静态分配。不幸的设计可能是,但它是存在的。

< P> C和C++是相同的。< /P> static做两件不同的事情

对于在函数作用域之外声明的变量,它会更改变量的可见性(链接)。该变量将是全局变量,因为它在函数作用域之外。如果它不是静态的,它将具有通用链接(可见性),因此与此链接在一起的任何代码都可以访问它(它们可能必须在外部声明)。如果变量在函数范围之外并且是静态的,则它仍然是一个全局变量,因为它始终存在并保留其值,但同一编译单元(包括.c文件和任何.h)之外的任何代码都无法访问它

对于在函数范围内声明的变量,static会更改变量的存储位置。如果它不是静态的,它将是一个自动变量,这意味着它会在函数退出并重新存在时消失(在堆栈上)当再次输入函数时。这将在退出函数时丢失其值。以及对它的任何引用(指向它的指针)函数退出后无效。如果函数作用域内声明的变量是静态的,则它将使其不是自动变量,而是全局分配的变量。因此,该变量将在函数退出后存在,从而在函数调用和任何引用(指针)之间保持其值即使在函数退出后,对它的访问仍然有效。请注意,在这两种情况下,变量的作用域仅在该函数内,因此无法从函数作用域外直接访问它(但只能通过保存的引用)


static所做的最后一件事是在运行变量的初始值设定项(即int foo=5)时进行更改。对于所有全局分配的情况(自动分配除外),初始值设定项仅在程序开始执行时运行一次。它在main()之前运行是偶数运行的,因此如果您的初始值设定项不是一个常量,而是运行一些代码,则可以得到一些不太理想的结果。对于自动情况,每次输入函数时都会运行初始值设定项,在这种情况下,它总是在输入main()之后运行。

我想补充一下Southern Hospitality的答案

我谨此陈辞如下:

< >使用“代码>静态<代码>指示“本地到翻译单元”在C++中被禁止(HReF=)https://rads.stackoverflow.com/amzn/click/com/0201700735“Re=”NoFoLoRoNeFror“C++编程语言:特别版,附录B.2.3,不推荐特征”。 您应该改用未命名的名称空间:

static int reply = 42; // deprecated

namespace {
    int reply1 = 42;  // The C++ way
}

正如南方好客所说的,全局对象的初始化顺序是未定义的。在这种情况下,应该考虑使用HeRF=http://en.wikipedia.org/wiki/Singleton_pattern#C.2B.2B,单件模式

更新: GMan评论了我的回答:


“每个翻译单位定义了……”:这真的让我不知所措,所以我用C++编程语言查了一下。

在第9.4.1节“非局部变量的初始化”中,Stroustrup教授建议“返回引用的函数是全局变量的良好替代方案”:

“对
use\u count()
的调用现在充当一个全局变量,在第一次使用时初始化。例如:

void f()
{

Std::CUT

不是你的问题的直接答案,而是密切相关的东西,如果你同时使用C和C++,请注意。 在C++中,与C不同的是,声明为“const”的全局变量在翻译单元中隐含地是局部的,就像使用了“static”一样。 例如:

// file A
extern const int glob;

// file B
const int glob = 42;

<>这将在使用C编译器而不是C++编译器时工作。在C++中,文件B中的GOLB变量不能从文件A使用,链接器将生成“未解析引用”。"错误。

那么如何访问C中文件外部的变量?
extern
将不能与
static
一起工作,对吗?可能是我太困惑了。@Naveen:没有问题,除非您声明它为
static
Ok。。那么在第二种情况下,变量
var
的存储类是什么?它有名字吗还是仅仅称之为全局变量?@Naveen:它是一个全局变量variable@Naveen:它有静态存储。请记住静态存储和static关键字不是相互的。任何非动态(从堆创建)或自动(必须在本地范围内创建)的变量是静态的。虽然static关键字提供了一些静态存储,但它做得更多。(使其在转换单元外部不可见。)相反,通过省略说明符,您仍然可以在单元外部看到一些具有静态存储的内容。您确定函数中的静态变量在main()之前初始化吗?我一直认为它们是初始化的
void f()
{
        std::cout << ++use_count() << '\n';
}
// file A
extern const int glob;

// file B
const int glob = 42;