是否有任何特定原因不应将函数调用用于C中的变量初始化器

时间:2019-04-24 21:56:09

标签: c function variables coding-style

我正在阅读多种风格指南,以尝试标准化我的编程风格。在阅读有关KNF的FreeBSD和OpenBSD样式指南时,我注意到以下段落相当混乱。

  

请注意不要通过初始化声明中的变量来混淆代码。请仅谨慎使用此功能。不要在初始化器中使用函数调用!

是否存在技术上的原因,初始化数据时不应使用函数调用?

2 个答案:

答案 0 :(得分:0)

  

是否存在技术上的原因,初始化数据时不应使用函数调用?

函数调用不仅应该,而且不能用于初始化静态变量或在文件作用域声明的变量。但是,它们可以用于初始化函数内部的自动变量。这样做的语义已经很好地定义了,所以我认为没有技术原因应该避免这种初始化。

我认为这是由引号的第一句话给出的这种样式规则的依据:

  

请注意不要通过初始化声明中的变量来混淆代码。

样式指南的作者显然认为使用初始化程序可能会造成混淆,而我在最后一句话中强调了这一点,以表明他们认为使用函数调用进行初始化绝对会造成混淆。

对于它的价值,我不同意那些样式准则。根据我的说法,如果实际上在该点上有一个有意义的,语义上正确的值,并且可以通过初始化程序方便地表示该值,则通常应在其声明中初始化变量。我也不反对初始化器中的函数调用。特别是,我通常会对此进行修改:

void foo(void) {
    int result;
    result = do_something();
    // ...
}

对此:

void foo(void) {
    int result = do_something();
    // ...
}

。我认为后者实际上稍微清晰一些,我认为它的行少了。

答案 1 :(得分:0)

这只是其创建者的语言规则。他们只是不喜欢这样,他们以为在main之前执行的代码太复杂,太长。

顺便说一句,许多实现提供了在main之前执行一些用户代码的机制。 gcc是__attribute__((constructor)),但它当然是扩展名。