是否有任何特定原因不能将函数调用用于C中的变量初始值设定项

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了是否有任何特定原因不能将函数调用用于C中的变量初始值设定项相关的知识,希望对你有一定的参考价值。

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

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

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

答案

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

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

我采用这种风格规则背后的基本原理由引文的第一句话给出:

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

样式指南的作者显然考虑使用初始化器可能是混淆的,我在最后一句中强调它们表明他们认为使用函数调用初始化肯定是混淆的。

对于它的价值,我不同意这些风格指南。根据我的说法,变量通常应该在它们的声明中初始化,如果事实上在那时它们有一个有意义的,语义正确的值,并且如果该值可以通过初始化器方便地表达。我也没有普遍反对初始化器中的函数调用。特别是,我通常会修改这个:

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

对此:

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

。我认为后者实际上更加清晰,我认为它只有一条线。

另一答案

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

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

以上是关于是否有任何特定原因不能将函数调用用于C中的变量初始值设定项的主要内容,如果未能解决你的问题,请参考以下文章

如何将二维数组的所有元素初始化为java中的任何特定值

是否有任何函数可以将c ++编程中的流转移到while循环或while循环中?

C++中,类内的成员变量自动初始化为零吗,而全局变量随意赋值

何时在声明或初始化时为变量分配内存?

是否有任何 linux 函数调用通过传递线程 ID 来获取特定线程的 CPU 使用率?

[C++11]委托构造函数