我是Linux内核开发的新手。
困扰我的一件事是声明和初始化变量的方式。
我的印象是代码使用C89 / ANSI C的变量声明放置规则(变量在块的开头声明),而C99放松了规则。
我的背景是C ++,很多人建议“非常聪明的人”尽可能在本地声明变量 - 在同一条指令中更好地声明和初始化:
在Linux内核中初始化变量的可接受方法是什么?
答案 0 :(得分:7)
我在Linux kernel coding style找不到相关的段落。因此,遵循现有代码中使用的约定 - 在块的开头声明变量 - 或者冒着代码看似不合适的风险。
块开头的变量是好事的原因:
答案 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内核需要再次更加便携 - 尤其是小型嵌入式系统。我想这个功能并不足以覆盖这些考虑因素。