代码之家  ›  专栏  ›  技术社区  ›  Aditya Sehgal

同时定义和分配的变量

  •  0
  • Aditya Sehgal  · 技术社区  · 15 年前

    比如

    int a = 0;
    

    应该不赞成。

    此外,还提到C99兼容编译器现在在上述情况下发出警告。

    对于所有其他情况,我发现定义和分配默认值是一项谨慎的工作,因为我在编写和维护代码时遇到了很多错误,因为指针未初始化。此外,我相信C++通过构造函数也提倡相同的方法,即定义和赋值。

    5 回复  |  直到 9 年前
        1
  •  1
  •   Eduard - Gabriel Munteanu    15 年前

    就编码风格而言,我认为你把事情看得太字面了。例如,您的陈述在以下情况下是正确的。。。

    int i = 0;
    
    for (; i < n; i++)
            do_something(i);
    

    ... 甚至在。。。

    int i = 1;
    
    [some code follows here]
    
    while (i < a)
            do_something(i);
    

    ... 但在我看来,还有其他一些情况可以通过提前“申报和分配”得到更好的处理。考虑在堆栈或各种OOP结构上构造的结构,如:

    struct foo {
            int bar;
    
            void *private;
    };
    
    int my_callback(struct foo *foo)
    {
            struct my_struct *my_struct = foo->private;
    
            [do something with my_struct]
    
            return 0;
    }
    

    void do_something(int a, int b, int c)
    {
            struct foo foo = {
                    .a        = a,
                    .b        = b + 1,
                    .c        = c / 2,
            };
    
            write_foo(&foo);
    }
    
        2
  •  1
  •   Pete Kirkham    15 年前

    通常,如果变量应该具有的值已知,我建议在定义变量时对其进行初始化,如果值未知,则不初始化变量。无论哪种方式,都要尽可能地将其用于范围规则允许的范围内。

    相反,应该在使用它们之前为它们指定一个默认值。

    此外,还提到C99兼容编译器现在在上述情况下发出警告。

    不是针对你展示的案例-你不会因为拥有 int x = 0; . 我强烈怀疑有人把这件事搞混了。如果使用变量时未为其赋值,并且存在以下情况,编译器会发出警告:

    ... some code ...
    
    int x;
    
    if ( a )
        x = 1;
    else if ( b )
        x = 2;
    // oops, forgot the last case else x = 3;
    
    return x * y;
    

    然后您将得到一个警告,x可能未经初始化就被使用,至少在gcc中是这样。

    x if ,但赋值是作为初始值设定项还是作为单独的语句完成并不重要。

    除非您有特定的理由为其中两个分支分配两次值,否则没有必要先将默认值分配给x,因为它会停止编译器警告您已经覆盖了每个分支。

        3
  •  0
  •   Michiel Buddingh    15 年前

    我有点同意这个建议,尽管我不完全确定标准中是否有关于它的内容,而且我非常怀疑编译器警告的内容是真的。

    问题是,现代编译器能够并且确实检测到未初始化变量的使用。如果在初始化时将变量设置为默认值,则会丢失该检测。默认值也会导致错误;当然在你的例子中, int a = 0; 0 是的适当值 a ?

        4
  •  0
  •   RCIX    15 年前

        5
  •  0
  •   Naunidh    15 年前

    由于未初始化的指针,我看到了太多的bug,所以我一直主张用NULL_PTR声明每个变量,用一些无效/默认值声明每个原语。

    由于我从事RTO和高性能但低资源系统的工作,我们使用的编译器可能无法捕获未初始化的使用。尽管我怀疑现代编译器也能100%可靠。

    所以我说,只要您使用的是普通的旧C/C++,就要坚持使用它。

    http://www.codeproject.com/KB/dotnet/DontInitializeVariables.aspx