- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
#include<iostream>
struct a{
int x;
};
int foo() {
a oa;
return oa.x;
}
int bar() {
int a;
return a;
}
int main() {
auto val = foo();
std::cout<<val<<"\n";
return 0;
}
如果我们编译并运行上面的 sample.cpp
,我们会得到以下结果:
$g++ -Wall -std=c++11 sample.cpp -o sample
sample.cpp: In function ‘int bar()’:
sample.cpp:13:9: warning: ‘a’ is used uninitialized in this
function [-Wuninitialized]
return a;
^
$ ./sample
-1643562384
$ ./sample
991591024
对于上面的程序,编译器会发出关于 bar()
函数内变量 a
的未初始化 使用的警告。但是,当 foo()
函数尝试使用类型为 struct a 的对象
。 oa
的变量 x
时,编译器不会发出警告
我知道c++11 universal initialization
特性,如果我们定义struct a
如下,那么内置int
struct a
的默认构造函数将调用类型默认构造函数。
struct a {
int x{};
}
我想知道像 type traits/static_assert
这样的新功能是否可以在上述情况下实现这样的警告消息?
这样的事情在像 C# 这样的语言中是可能的,因为一切都是从公共(public)类派生的,因此默认构造函数会关心这一点。 Bjarne Stroustrup 在他的“The C++ Programming Language”中提到了这种复杂化的原因是为了在罕见的关键情况下提高性能。
struct Buf {
int count;
char buf[16∗1024];
};
我们可以将 Buf
用作局部变量,而无需在将其用作输入操作的目标之前对其进行初始化。但我认为,如果我们可以实现某种机制来处理这个问题,那在很多情况下都会很棒。这将非常有用,因为未初始化的变量使用是非确定性错误的主要来源。
最佳答案
这只能在非常简单的情况下实际工作,正如您在此处展示的那样。在其他情况下,编译器甚至无法判断成员变量是否在使用前进行了初始化。例如:
// a.h
void init_a(a & an_a);
// a.cpp
#include "a.h"
void init_a(a & an_a) {
an_a.x = 1;
}
// b.cpp
#include "a.h"
int test() {
a oa;
init_a(oa);
return oa.x;
}
由于 init_a()
没有定义在与 test()
相同的翻译单元中,编译器无法知道 x
成员是否是在到达 return
语句时分配。
所以这样的警告只能在编译器能够证明成员可能没有被初始化的情况下触发,而在很多情况下编译器无法判断也无法产生警告。因此,有这样的警告只能捕捉到极其简单的情况,作用非常有限。
关于c++ - 如何为类的内置类型成员变量获取/实现 "Uninitialized uses warning"消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26447554/
warnings.warn() 和有什么区别?和 logging.warn()就它们的作用和应该如何使用而言? 最佳答案 我同意另一个答案——logging 用于记录,warning 用于警告——但我
这是我写的代码: #usr/bin/python3 import warnings def tt(): warnings.warn("123") return 10 x = tt()
我正在尝试使用基于文档中显示的示例的代码片段来提出DeprecationWarning。 http://docs.python.org/2/library/warnings.html#warnings
我正在尝试提出一个 DeprecationWarning,其中包含基于文档中显示的示例的代码片段。 http://docs.python.org/2/library/warnings.html#war
我有兴趣尝试在调用时操纵警告,而无需围绕方法创建支持基础设施。也就是说,我需要能够捕获警告,而无需使用以下代码包装代码: tryCatch(..., warning = function() { ac
我是 js 我正在尝试使用 this.setState({但我收到警告。 你们能告诉我为什么我收到以下警告吗 warning.js:45 警告:setState(...):只能更新已安装或正在安装的组
我的最小例子是 #!/usr/bin/python3 import warnings warnings.warn('Run Forest run!', stacklevel=2) warnings.w
本文整理了Java中com.ibm.wala.util.warnings.Warnings.asString()方法的一些代码示例,展示了Warnings.asString()的具体用法。这些代码示例
本文整理了Java中com.ibm.wala.util.warnings.Warnings.clear()方法的一些代码示例,展示了Warnings.clear()的具体用法。这些代码示例主要来源于G
本文整理了Java中com.ibm.wala.util.warnings.Warnings.add()方法的一些代码示例,展示了Warnings.add()的具体用法。这些代码示例主要来源于Githu
我一定是错误地理解了警告文档。我读它的方式,这段代码: use warnings; use warnings FATAL => 'all'; warnings::warn('numeric', 'bl
我在 Linux 上使用 OpenMP 指令编译 C 代码时收到此警告: warning: ignoring #pragma omp parallel Gcc 版本是 4.4。 这只是一个我不应该关心
我有一个奇怪的 g++ 行为,当显示任何其他警告时,它会显示有关无法识别的命令行选项的警告。 例子: struct Foo{virtual int bar() = 0;}; struct Bar:pu
在 Visual Studio 2010 中使用 C++ native 解决方案。 #pragma warning (push) 用于 cpp 文件的开头,在所有包含之后。之后,#pragma war
我习惯于开始我的每一个脚本 use strict; use warnings; 但是这里的一些知名人士推荐 use warnings 'all'; 如果我理解正确,后者甚至比第一个更好。所以我通读了d
我正在编码C#。我使用NCrunch在后台运行单元测试。我已经在CSPROJ文件中设置了(新的CSPROJ格式)。 我想将FxCop分析仪用作NuGet软件包:https://docs.microso
谁能帮我解决这个问题,我收到此警告消息 log4j:WARN No appenders could be found for logger (com.akak.book.shop.listener.L
我正在尝试了解更多关于 linux 内核中的 kobject 的信息,并且在尝试编写一个使用此类工具的模块时,我收到了错误和警告消息,因此我将相关数据的精简版本放在这里结构和相应的gcc的错误和警告信
http://docs.python.org/2/howto/logging.html 上的样本同时使用 warn 和 warning。 最佳答案 logging.warn 自 Python 3.3
警告[nuxt]两个解析为相同名称ProseCode的组件文件:。警告[nuxt]两个解析为相同名称ProsePre的组件文件:。更新nuxt 3后的警告->3.7&nuxt/内容2.4->2.8。如
我是一名优秀的程序员,十分优秀!