Clang未报告C+中的非斜体变量+;? 我知道C++中没有自动初始化局部变量,所以在使用它们之前,应该总是给它们赋值。然而,至少在简单的情况下,编译器应该警告您,以防您忘记它。我或多或少地依赖和指的是

Clang未报告C+中的非斜体变量+;? 我知道C++中没有自动初始化局部变量,所以在使用它们之前,应该总是给它们赋值。然而,至少在简单的情况下,编译器应该警告您,以防您忘记它。我或多或少地依赖和指的是,c++,clang,compiler-warnings,compiler-flags,C++,Clang,Compiler Warnings,Compiler Flags,有了这个程序,我假设在将x发送到std::cout时会收到警告 #include <iostream> int main(int argc, const char * argv[]) { int x; std::cout << x; return 0; } #包括 int main(int argc,const char*argv[] { int x; 标准::cout 为什么不发出警告 在我的系统上使用带有-Wall的clang可以正确地警告错误。

有了这个程序,我假设在将
x
发送到
std::cout
时会收到警告

#include <iostream>

int main(int argc, const char * argv[])
{

  int x;
  std::cout << x;

  return 0;
}
#包括
int main(int argc,const char*argv[]
{
int x;
标准::cout
  • 为什么不发出警告

  • 在我的系统上使用带有
    -Wall
    clang
    可以正确地警告错误。显然,默认设置不包括
    -Wall
    (可能是为了避免使用在引入某些警告之前编写的正确代码生成警告)

    一般来说,如果你依赖编译器帮助你草率编程,你会遇到麻烦。仔细思考代码输入,希望编译器告诉你所有错误,这在任何语言中都是坏的,但C++是真正的灾难。C++的主要思想是程序员不会犯任何错误。,所以不要做这些;-)

    如果可以,请仔细考虑并始终使用
    -Wall

  • 为什么要初始化

  • 显然,你不理解“未定义行为”的含义。这并不意味着程序崩溃,也不意味着它会做任何有趣的事情。这意味着它可以做任何事情,通常程序做任何事情都会给你带来未来最大的问题

    通常,这种最危险的行为是使其看起来一切正常(例如,变量确实已初始化)。只有当您将代码投入生产或在大量观众面前显示您的程序运行时,坏值才会显示出来。此时,值将不同,您的公共崩溃视频将在youtube上传播,您的妻子将更换门锁,甚至您的父母也不会接听您的电话


    只需初始化变量即可;这样做更好:-)

    这是必要的,但足以打开
    -Wall
    以确保代码安全

    e、 g.以下代码,在MacOS的g++(它的叮当声)下,将打印出0,但它肯定是UB:

    #包括
    #包括
    使用名称空间std;
    类Blob{
    公众:
    智力年龄;
    void hello(){printf(“hello\n”);}
    };
    int main(){
    斑点a;
    //a、 你好;
    
    cout“似乎是草签的”不保证它总是被初始化。是的。我只是假设在99%的情况下都会得到完整的垃圾输出,并且想知道我的工具链/设置的任何部分是否确实确保它被初始化?刚刚发现这一点澄清了第二点:为了解决查找未初始化变量的问题,在运行调试器中的程序通常为零。这意味着您的程序每次在调试器中运行时都可以正常工作,但在发布模式下会间歇性崩溃!()。“预期”垃圾值会在我切换到发布版本时立即显示…
    -Wall
    确实起到了作用。我只是想澄清一下:我不是想质疑初始化变量的必要性,我只是不明白默认编译器设置为何没有报告此问题。感谢您的帮助和解释。