在C和C静态变量++

是否有声明的变量之间的任何差别static C和C ++之间的任何功能之外。 我读了static方式文件的范围和变量将不会是文件外部访问。 我也看到,在C,全局变量是static 。 这是否意味着,在C全局变量不能在另一个文件进行访问?

--------------解决方案-------------

不,在这方面的C和C ++之间没有什么区别。

阅读本SO回答关于什么static在C程序的手段。 在C ++中有几个与使用的其他含义的static类变量(而不是实例变量)。

对于全局变量是static -仅从内存分配点(他们被分配在数据段,因为所有的全局变量)。 但从知名度的点:

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

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

外的函数的关键字是指联动,里面指的是分配。 功能以外的所有变量都具有静态分配含蓄。 一个不幸的设计也许,但它就在那里。

C和C ++是相同的。

静做两个不同的东西。

对于超出函数范围内声明的变量,它改变了变量的可见性(连接)。 变量将是一个全局变量,因为它是外部的功能范围。 如果不是一成不变的,它会具有普遍联系(知名度),所以这个可以访问它联系在一起(他们可能不得不宣布它为extern)的任何代码。 如果变量超出函数范围,是静态的,它仍然在于其始终存在,并保持其价值,但相同的编译单元以外的任何代码(即.c文件和所有的.h文件包含的)一个全局变量可以访问它。

对于函数范围内声明的变量,静态改变其中变量的存储位置。 如果不是静态的,这将是一个自动可变的,这意味着它消失作为函数出口和回来进入存在(在栈上)时的函数被再次输入。 这也失去了它的价值,当你退出功能。 而且也把它(指针的话)的任何引用是函数退出后失效。 如果一个函数范围内声明的变量是静态的,那么它使得它不是一个自动变量而是全局分配的。 因此,该变量将在函数退出后存在,因此将保持其价值跨越函数调用以及任何引用(指针),它甚至在函数退出后是有效的。 请注意,在两种情况下,变量的范围是仅在该功能,因此它不可能直接访问它(但仅通过保存的参考)从功能范围之内。

最后一件事静确实是变化的初始化(即INT富= 5)为变量运行时。 对于所有的,其中分配是全球(除自动一体每一种情况下)的情况下,初始化只运行一次,在程序的执行的开始。 这是前主运行()甚至运行,因此你可以得到一些不太期望的结果,如果你的初始化不只是一个恒定的数字,但运行的一些代码。 为自动的情况下,初始运行在每次函数输入的时间,在这种情况下,它是主()已经被输入之后始终。

我想补充到南方盛情的回答http://stackoverflow.com/questions/2528457/static-variables-in-c-and-c/2528624#2528624

以下意见:

使用static表示“当地翻译单位”是不赞成使用C ++(HREF =“http://rads.stackoverflow.com/amzn/click/0201700735”C ++程序设计语言:特别版,附录B.2.3,已过时特征)。

您应该使用未命名的命名空间,而不是:

static int reply = 42; // deprecated

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

前面已经说了由南招待费,全局对象的初始化顺序是不确定的。 在这种情况下,你应该考虑使用在href =“htt​​p://en.wikipedia.org/wiki/Singleton_pattern#C.2B.2B”,Singleton模式。

更新:GMAN评论我的回答:

“订单是指每个翻译单元,...”:这真是我忘了,所以我看着它在C ++编程语言。

在第9.4.1节,非局部变量的初始化,斯特劳斯教授认为,“返回一个引用的函数是一个很好的替代全局变量”:

int& use_count()
{
static int uc = 0;
return uc;
}

“一个调用use_count()现任即在第一次使用初始化的全局变量,例如:”

void f()
{
std::cout << ++use_count() << '\n';
}

在我的理解,这是非常相似的Singleton模式。

GMAN进一步评论说:“我们需要限制我们创建这些对象之一,并提供全球访问它的能力。” 是否限制了一个真正涉及到的问题什么? 我们可能会在全球范围需要一个,但谁又能说,我们不希望它在别的地方?“

从辛格尔顿一些报价(127)(Gamma等,设计模式):

“单件模式是一种改进的全局变量。它避免污染与存储唯一实例全局变量的名称空间”。

“该模式可以很容易地改变了主意,并允许单例类的多个实例。”

单身在他们第一次使用的顺序初始化。

在香草萨特,安德烈Alexandrescu的,C ++编码标准,第10项说:

“避免共享数据,特别是全球的数据。”

因此,我经常用单身,以避免全球性的数据。 但是,当然,因为一切都是overusable,这可能是单例模式的过度使用。 (Johshua Kerievsky在他的著作“重构为模式”称此为“Singletonitis”。)

更新2:

(很抱歉,但我不会写评论,因此该更新。)

Jalf写在他的评论:“四人帮被吸烟违法的事时,他们写的单例模式。”

显然,其他C ++开发人员熏有趣的物质,太。 例如,香草萨特(他担任了十多年作为ISO C ++标准委员会书记,主席的第二个C的开发过程中++标准C ++ 0x中,并作为C ++ / CLI在微软的首席架构师。香草是目前微软平台和Concur的扩展到Visual C ++并行编程)的棱镜内存模型的设计者,写在C ++编码标准,第21项:

“当你需要这样的空间(namespace级)变量可能依赖于另一个,考虑Singleton设计模式;谨慎使用,这可能避免暗指的依赖,确保一个对象第一次访问时初始化不过,辛格尔顿是一个全局变量。羊皮,并通过相互或循环依赖坏了。“

因此,避免全球性的数据,如果你能。 但是,如果你要使用不同的翻译单元的全球数据,辛格尔顿应该是为执行特定的初始化序列可以接受的解决方案。

需要注意的是在Java语言中的全局数据甚至不存在。 显然,全球数据被替换/仿真通过使用Singleton设计模式。

(因为我在我的dayjob与Java团队工作,我努力为我用Java程序C ++程序的最大相似性。例如,每类坐落在其自己的源文件/翻译单元)。

不是一个真正的直接回答你的问题,但一些密切相关的注意,如果您同时使用C和C ++进行。

在C ++中,不像C,这是申报的“常量”全局变量是隐式本地的翻译单元,仿佛“静态”已被使用。

例:

// file A
extern const int glob;

// file B
const int glob = 42;

这将如果您使用的是C编译器,但不与C ++编译器的工作。 在C ++中,文件B中的glob变量不能从文件中的使用,并且链接会产生一个“未解决的引用”错误。

分类:C# 时间:2015-03-15 人气:0
本文关键词: C#中,静态,全局变量
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.977 (s). 10 q(s)