什么是c或c ++中的静态块?
我想通过一个例子知道c或c ++中的静态块是什么?我知道什么是静态但静态和静态块有什么区别?
没有找到相关结果
已邀请:
5 个回复
哭木算
然而。之前我被它咬过,因为它是C ++的一个微妙优势 标准。如果主要调用的任何代码都无法访问静态对象 可以调用也可以不调用静态对象的构造函数。 我发现使用gcc hello将获得输出,并且使用visual studio它将会 不。
目浆搽
这也意味着,就像Java的静态块一样,你不需要实际拥有
的实例,这在类可以占用大量数据时很有用,而你只需要在加载之前自动调用某些东西,而不是实例化一个额外的例子。您可以测试该确切的代码块。我刚编译它(带有一些来自static_init()的输出,并且main()打印Foo :: __ st_init,只是为了确保),它工作得很好。
编辑: 对不起,这太晚了,但我测试了bradgonesurfing提到的: 如果你测试它我访问main中的变量“只是为了确保” 你确保变量是可达的,因此变量将是 被初始化,因此将调用static_init。你确定吗 如果你不打印Foo :: __ st_init就会执行 我在main.cpp中使用了以下内容:
我用
编译并运行它并收到一个友好的“Hello,World!”我的控制台上的消息。为了彻底,我也编译了相同的版本,但没有打印和编译与
。然后我用gdb运行可执行文件并得到以下结果:
这是g ++的更新版本输出:
茬贺努充尽
但这不是线程安全的。在存在多个线程的情况下使这种工作正常有时是困难和棘手的。
屉杆绊
或者你想要的任何其他东西但是,在文件范围内,您不能拥有类中的那些。在我对相关问题的回答中查看这些内容的详细说明,以及
的代码。 注意:这不需要C ++ 11,并且适用于旧的编译器。
版萍层分
在C中获得相同的效果
简单来说,编译器不会从中导出符号 翻译单位,如果它们被声明为静态或 在匿名命名空间中。