gpt4 book ai didi

c - C 函数通常比 OOP 语言的方法有更多的参数吗?

转载 作者:行者123 更新时间:2023-12-05 08:50:16 25 4
gpt4 key购买 nike

我不得不编写一个包含 600 多行和大约 25 个函数的 C 程序。这是我写过的最长的 C 代码。

我注意到有些函数有超过 5 个参数。直接从 main() 调用的那些有更多的参数。它离 main() 越远,越少。

我还注意到,我经常不得不将参数传递给函数,不是因为该函数直接使用该参数,而是该函数调用了另一个需要该参数的函数。

所以它看起来像

void f1(int a, int b,..., int bar){
int foo = f2(bar); // the only time 'bar' is used in f1
.
.
.
}

我试图尽量减少全局变量的使用,但我不得不声明一些全局变量,因为一些参数变得太多余了。基本上我必须将这些参数传递给每个函数。

我不是一个经验丰富的程序员,但当我用 Java 编程时,我认为我不需要编写包含 5 个以上参数的方法。

在 C 中传递比其他语言更多的参数是否正常?这只是过程编程与 OOP 的本质吗?或者我只是在编写糟糕的 C 代码?

最佳答案

您对避免太多全局变量的担忧是正确的,因为有了它们,程序往往变得难以维护,尤其是当它们的规模增长时。因此,让我们通过参数将数据传递给函数。

使用参数为您的函数提供它们执行所需的信息是一个好主意,原因有很多。它首先提供了代码的可读性,而且还使编写线程安全函数(可以从不同线程安全调用的函数)变得更加容易。

总之,一般来说,定义一个太多参数的函数,有时确实会导致效率低下,在堆栈消耗方面(尤其是在嵌入式系统中,只有前3个参数或 4 个参数使用处理器寄存器,所有其他参数复制到堆栈)。

解决方案是使用数据结构。使用 struct(与 so 不同,在 OOP 语言如 Java 中,您会调用 objects),您可以将全局数据组合在一起在逻辑实体中。这使得可以一起定义所有数据,更改其字段并将其传递给您的函数。并且通过指针传递它可以在其原始位置修改它。

因此您的示例函数将变为

typedef struct
{
int a;
int b;
int bar;
} MyData_t;

void f1( MyData_t *data )
{
int foo = f2( data->bar );

/* ... */
}

int main( void )
{
MyData_t d = { 5, 7, 9 };

f1( &d );

return 0;
}

您需要更改 f2() 并向其传递更多参数吗?好吧,将指向 MyData_t 的指针转发给它,您将访问所需的所有变量。


总而言之,回答你的问题,统计分析可能会导致在 OOP 语言中传递的参数比在过程语言中传递的参数少:只是因为在大多数语言中,调用对象将是一种程序语言。但是对于设计良好的结构化编程,这种差异会非常小。

关于c - C 函数通常比 OOP 语言的方法有更多的参数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62416770/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com