我正在阅读多种风格指南,以尝试标准化我的编程风格。在阅读有关KNF的FreeBSD和OpenBSD样式指南时,我注意到以下段落相当混乱。
请注意不要通过初始化声明中的变量来混淆代码。请仅谨慎使用此功能。不要在初始化器中使用函数调用!
是否存在技术上的原因,初始化数据时不应使用函数调用?
答案 0 :(得分:0)
是否存在技术上的原因,初始化数据时不应使用函数调用?
函数调用不仅应该,而且不能用于初始化静态变量或在文件作用域声明的变量。但是,它们可以用于初始化函数内部的自动变量。这样做的语义已经很好地定义了,所以我认为没有技术原因应该避免这种初始化。
我认为这是由引号的第一句话给出的这种样式规则的依据:
请注意不要通过初始化声明中的变量来混淆代码。
样式指南的作者显然认为使用初始化程序可能会造成混淆,而我在最后一句话中强调了这一点,以表明他们认为使用函数调用进行初始化绝对会造成混淆。
对于它的价值,我不同意那些样式准则。根据我的说法,如果实际上在该点上有一个有意义的,语义上正确的值,并且可以通过初始化程序方便地表示该值,则通常应在其声明中初始化变量。我也不反对初始化器中的函数调用。特别是,我通常会对此进行修改:
void foo(void) {
int result;
result = do_something();
// ...
}
对此:
void foo(void) {
int result = do_something();
// ...
}
。我认为后者实际上稍微清晰一些,我认为它的行少了。
答案 1 :(得分:0)
这只是其创建者的语言规则。他们只是不喜欢这样,他们以为在main之前执行的代码太复杂,太长。
顺便说一句,许多实现提供了在main之前执行一些用户代码的机制。 gcc是__attribute__((constructor))
,但它当然是扩展名。