草庐IT

全局剪枝

全部标签

c++ - 为什么未初始化的全局变量是弱符号?

似乎未初始化的全局变量在Gcc中被视为弱符号。这背后的原因是什么? 最佳答案 gcc,C模式:未声明extern的未初始化全局变量被视为“通用”符号,而不是弱符号。公共(public)符号在链接时合并,以便它们都引用相同的存储;如果不止一个对象试图初始化这样一个符号,您将得到一个链接时错误。(如果它们没有在任何地方显式初始化,它们将被放置在BSS中,即初始化为0。)gcc,在C++模式下:不一样-它不做常见符号的事情。未声明为extern的“未初始化”全局变量被隐式初始化为默认值(简单类型或默认构造函数为0)。无论哪种情况,弱符号都

c++ - 我如何在 visual studio 的监 window 口中列出和监视所有全局变量(对于 c++)?

当在main()的断点处停止时,我可以手动将全局变量的名称添加到监window口,但我想要的是如何显示所有全局变量的列表,因为我使用的是外部库,其中包含许多静态的东西。可能吗?提前致谢! 最佳答案 是你不知道全局变量名的问题吗?或者是你想查看很多全局变量而不想在监window口中一遍又一遍地键入它们的问题?目前我假设是第二种。我还假设您的外部库是.LIB库而不是.DLL。您可以编写一个类,其中包含您要监视的每个全局变量的一个成员,使其成为一个引用,并在启动时构造该类的一个实例,将全局变量分配给引用成员,如下所示:classMyGlo

c++ - 有没有办法警告我全局命名空间污染?

gcc(或任何其他编译器)是否有警告我全局命名空间污染的选项?我试图编译一个示例应用程序套件,但事实证明该示例的很多头文件都受到全局命名空间污染的困扰(在header中使用命名空间文件),因此MacOSX全局结构Rect变得不明确。我还尝试更改#include的顺序以在usingnamespace的雷区之前解析系统的Rect符号,但这导致一些符号最终没有解析。我之前使用谷歌搜索失败,虽然预感不好,如果存在这种警告选项,请给我信息。 最佳答案 我不知道gcc,但CLang有:defwarn_using_directive_in_hea

c++ - C++ 全局初始化可以有多惰性?

我习惯于认为全局变量/静态类成员的所有初始化都发生在main()的第一行之前。但我最近在某处读到该标准允许稍后进行初始化以“协助动态加载模块”。当动态链接时我可以看到这是真的:我不希望在我dlopen'ed库之前初始化库中的全局初始化。但是,在一组静态链接在一起的翻译单元(我的应用程序的直接.o文件)中,我会发现这种行为非常不直观。这只会在动态链接时延迟发生,还是可以随时发生?(或者我读错了什么?;) 最佳答案 该标准在3.6.2/3中有以下内容:Itisimplementation-definedwhetherornotthedy

android - JNI 保持对对象的全局引用,使用其他 JNI 方法访问它。在多个 JNI 调用中保持 C++ 对象存活

我刚开始使用JNI,但遇到以下问题。我有一个包含简单类的C++库。我从JavaAndroid项目中调用了三个JNI方法,分别实例化所述类、调用实例化类的方法并销毁它。我保留了对该对象的全局引用,因此我可以在其他两个JNI方法中使用它。我怀疑我做不到。当我运行该应用程序时,出现运行时错误(使用过时的引用),我怀疑这是因为全局引用在后续调用其他JNI方法时无效。是实现我想要的(让对象在多个JNI调用中存在)的唯一方法,实际上将指向实例化类的指针传回Java,将其保留在那里,然后将其传回JNI功能?如果是这样,那很好,我想确保我不能用全局引用来做到这一点,而且我不仅仅是遗漏了什么。我已经阅读

从另一个命名空间内访问 C++ 全局命名空间

在下面的C++代码中,foobar首先为单个double参数定义,然后再次为类型为Foo的单个参数定义.两者都在全局命名空间中定义。在one命名空间中,定义了foobar的进一步重载,具有Bar类型的单个参数。从这个版本的foobar开始,使用double参数(42.0)对foobar的非限定调用将失败。对foobar的类似调用,这次使用(::)范围解析运算符限定,还使用​​double参数,但会成功。另一方面,使用类型为Foo的参数对foobar的非限定调用会成功。使用范围解析运算符限定的Foo参数调用foobar也会成功。为什么这两种情况的表现不同?我同时使用gcc4.7和clan

c++ - 在C++中编译全局变量的重声明错误,但在C中没有

假设我有这三个文件:啊.h//a.hheader#includeintint_variable;voida_f(){printf("int_variable:%d\n",int_variable)int_variable++;}b.h//b.hheader#includeintint_variable;voidb_f(){printf("int_variable:%d\n",int_variable)int_variable++;}ma​​in.c//main.c#include"a.h"#include"b.h"intmain(){a_f();b_f();return0;}为什么在C

c++ - 表达式f()>g()的值,当f&g修改同一个全局变量undefined或unspecified时?

更新:根据用户ecatmur的标记,它是InC99,isf()+g()undefinedormerelyunspecified?的拷贝(尽管问题询问的是C99,但C++的答案不变)。答案是:未指定(对于这两种情况)。考虑以下C++14代码片段:inti=0;intx(){i++;returni;}inty(){i++;returni;}boolz=(x()>y());//unspecifiedorundefined?z的值只是未指定,还是未定义的行为?根据我的理解(如果我错了请更正),这样的表达式:i++>i++将是未定义的行为,因为我们在一对序列点之间对同一个变量进行两次变异,但是上

c++ - C++ 类的全局实例

正如标题所说。我将如何创建一个全局可用的类的实例(例如,我有一个用于打印的仿函数,我想拥有它的一个全局实例(尽管有可能创建更多实例))。 最佳答案 竭尽全力使用通常的模式制作单例对象并不能解决问题的第二部分-如果需要,可以制作更多。单例“模式”非常严格,只不过是另一个名称的全局变量。//myclass.hclassMyClass{public:MyClass();voidfoo();//...};externMyClassg_MyClassInstance;//myclass.cppMyClassg_MyClassInstance;

c++ - 为什么我可以从全局范围调用私有(private)构造函数?

此代码编译和运行没有错误:classfoo{staticfoo*ref;foo(){}public:staticfoo*getRef(){returnref;}voidbar(){}};foo*foo::ref=newfoo;//theconstrucrtorisprivate!intmain(intargc,constchar*argv[]){foo*f=foo::getRef();f->bar();return0;}谁能解释一下为什么可以调用构造函数? 最佳答案 该范围不是全局的-静态成员在类范围内,因此它们的初始化表达式也在类