尽可能在本地声明变量

时间:2011-08-25 09:18:27

标签: c coding-style linux-kernel

我是Linux内核开发的新手。

困扰我的一件事是声明和初始化变量的方式。

我的印象是代码使用C89 / ANSI C的变量声明放置规则(变量在块的开头声明),而C99放松了规则。

我的背景是C ++,很多人建议“非常聪明的人”尽可能在本地声明变量 - 在同一条指令中更好地声明和初始化:

在Linux内核中初始化变量的可接受方法是什么?

6 个答案:

答案 0 :(得分:7)

我在Linux kernel coding style找不到相关的段落。因此,遵循现有代码中使用的约定 - 在块的开头声明变量 - 或者冒着代码看似不合适的风险。

块开头的变量是好事的原因:

  • 目标架构可能没有C99编译器
  • ... 无法想到更多原因

答案 1 :(得分:2)

您应该始终尝试在本地声明变量。如果你使用的是C ++或C99,那通常就在第一次使用之前 在较旧的C中,这样做不属于“可能”,并且声明这些变量的位置通常是当前块的开头。

(我说'通常'是因为某些情况下有函数和循环,最好让它们更全面......)

答案 2 :(得分:1)

在大多数正常情况下,请在您使用它们的函数的开头声明它们。有例外,但它们很少见。

如果您的功能足够短,则减速度远离第一次使用。如果你的功能比那更长 - 这是一个好的迹象,你的功能太长了。

许多基于C ++的编码标准推荐接近使用的原因是C ++数据类型可能更“胖”(例如具有多个继承等的类),因此占用更多空间。如果你在一个函数的开头定义了这样一个实例,但是使用它的时间太晚了(也许根本就没有)你浪费了很多RAM。这在C语言中往往不是一个问题,它只有原生类型的数据类型。

答案 3 :(得分:1)

Coding Style文件中有一个倾斜的引用。它说:

  

该函数的另一个度量是局部变量的数量。他们   不应该超过5-10,否则你做错了什么。重新思考   功能,并将其分成更小的部分。人脑可以   通常很容易跟踪大约7种不同的东西,更多   它变得困惑。你知道你很聪明,但也许你会喜欢   了解你从现在起2周后做了什么。

因此,虽然C99风格的就地初始化程序在某些情况下很方便,但您应该首先问自己的是为什么很难将它们全部放在函数的顶部。这不会阻止您在块标记内声明内容,例如用于循环计算。

答案 4 :(得分:0)

在较旧的C中,可以通过在函数内创建一个块来在本地声明它们。即使没有ifs / for / while:

,也可以添加块
int foo(void)
{
    int a;
    int b;

    ....

    a = 5 + b;

    {
         int c;
         ....
    }
}

虽然它看起来不太整洁,但即使在较旧的C中也是如此。

答案 5 :(得分:-1)

我不能说他们为什么在Linux内核中以某种方式做事,但在我们开发的系统中,我们倾向于不在核心代码中使用特定于C99的功能。个别应用程序倾向于为C99编写内容,因为它们通常会部署到一个已知平台,并且gcc C99实现已经很好。

但核心代码必须可以在客户要求的任何平台上进行部署(在合理范围内)。我们在AIX,Solaris,Informix,Linux,Tru-64,OpenVMS(!)上提供了系统,并且并不总能保证存在符合C99标准的编译器。

Linux内核需要再次更加便携 - 尤其是小型嵌入式系统。我想这个功能并不足以覆盖这些考虑因素。