当我运行静态代码分析器 QACPP 时,我收到警告。根据 QACPP 文档,初始化为{0}
仅适用于内置类型。初始化类型对象的数组A
, {}
必须使用。如下:
int i[5] = {0}; // Only works with built-in types.
A a[5] = {}; // OK, works with both built-in and class types
这是标准的 C++ 规则吗?据此,指向类类型的指针数组也必须用以下方式初始化{}
, right?
这个说法是否:
A* ap[5] = {}
初始化 5 个指针NULL
?
当我使用时 QACPP 向我发出警告A* ap[5] = {NULL}
,尽管代码即使在其他情况下也可以编译并完美运行。
额外的
我认为警告更多是因为数组是静态的。
这是我在文档中找到的解释:
使用中存在很多问题
静态存储对象的数量
持续时间,特别是那些宣布的持续时间
功能之外。如果很多
函数可以访问静态对象
这种情况可能会变得困难
维持。另外,在以下情况下
多线程应用程序就变成了
需要用互斥锁来保护每个
可访问的静态对象
同时。因此它是一个很好的
限制静态范围的想法
尽可能地反对,以便
你知道这个物体在哪里
已访问。
具有 static 的命名空间或类对象
存储期限将被初始化
在程序开始之前
调用main(),以及调用的顺序
初始化未指定。
依赖顺序
初始化可能会导致对象
在它们被使用之前被使用
已初始化。如果抛出异常
作为初始化的结果
程序将非本地对象
立即终止。
具有 static 的块作用域对象
存储期限将被初始化
当函数第一次被调用时。
因此,最好使用
单例模式而不是命名空间
对象和静态数据成员。这
需要将对象包装在
作为本地静态对象运行,并且
让函数返回一个引用
到这个对象。
是的,这是标准规则。数组是一个聚合。聚合标准中明确提到了初始化规则。
是否有这样的语句:A* ap[5] = {}
用NULL初始化5个指针?
Yes
当我使用 A* ap[5] = {NULL} 时,QACPP 向我发出警告
什么警告?也许警告是您只初始化了第一个元素,其他元素将保持为 NULL。当然,这可能正是您所需要的。但是,编译器只是警告你:)
我想这个问题和答案会很有趣。什么是聚合和 POD?它们有何特别之处/为何如此特别? https://stackoverflow.com/questions/4178175/what-are-aggregates-and-pods-and-how-why-are-they-special
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)