C 在要解压缩的结构、外部变量或长参数列表之间进行选择

C 在要解压缩的结构、外部变量或长参数列表之间进行选择,c,struct,arguments,parameter-passing,extern,C,Struct,Arguments,Parameter Passing,Extern,我很好奇,关于如何向函数传递大量值,是否有一个共同的约定(一般情况下,以及何时使用相同的值多次调用函数)。例如,以下哪项可能更可取: int function(int val1, int val2, int val3, int val4, int val5, int val6, int val7) { return val1+val2+val3+val4+val5+val6+val7; } 或 或者(大多数情况下,函数将使用相同的参数多次调用) 哪个更可取取决于代码可读性或性能对特定项

我很好奇,关于如何向函数传递大量值,是否有一个共同的约定(一般情况下,以及何时使用相同的值多次调用函数)。例如,以下哪项可能更可取:

int function(int val1, int val2, int val3, int val4, int val5, int val6, int val7)
{
    return val1+val2+val3+val4+val5+val6+val7;
}

或者(大多数情况下,函数将使用相同的参数多次调用)

哪个更可取取决于代码可读性或性能对特定项目是否更重要


数组怎么样?如果这些值有不同的类型,那么就应该创建一个结构。全局变量建议应该立即被捕获、隐藏、遗忘。如果没有看到调用站点,就很难知道什么是最好的。您省略了一个选项—传递指向结构的指针,而不是结构的副本。(您最初使用的符号是
->
而不是
——可能我编辑的方式不对。传递结构有两种方式——按值传递和按指针传递。)如果结构在主计算中有用,它可能有意义(特别是按指针传递的变体)。无需在添加局部变量之前将其解包成局部变量;幸运的是,编译器可能不会这样做,而是会优化代码。对于一个需要很多单独参数的函数来说,有一点代码味道(其中“很多”的定义存在争议)。当然,在这种情况下,如果函数是合理的,那么参数之间存在某种关系;可能应该选择参数类型来包含和表达这种关系。@JonathanLeffler是的,它应该是一个指针。希望现在一切都好了。它会对局部变量执行更复杂的操作,其中一些是指针,它会改变其中的内容。数组呢?如果这些值有不同的类型,那么就应该创建一个结构。全局变量建议应该立即被捕获、隐藏、遗忘。如果没有看到调用站点,就很难知道什么是最好的。您省略了一个选项—传递指向结构的指针,而不是结构的副本。(您最初使用的符号是
->
而不是
——可能我编辑的方式不对。传递结构有两种方式——按值传递和按指针传递。)如果结构在主计算中有用,它可能有意义(特别是按指针传递的变体)。无需在添加局部变量之前将其解包成局部变量;幸运的是,编译器可能不会这样做,而是会优化代码。对于一个需要很多单独参数的函数来说,有一点代码味道(其中“很多”的定义存在争议)。当然,在这种情况下,如果函数是合理的,那么参数之间存在某种关系;可能应该选择参数类型来包含和表达这种关系。@JonathanLeffler是的,它应该是一个指针。希望现在一切都好了。它将对局部变量执行更复杂的操作,其中一些是它将更改其内容的指针。
struct int_struct {
    int val1;
    int val2;
    int val3;
    int val4;
    int val5;
    int val6;
    int val7;
};

int function(struct int_struct * ints)
{
    int val1 = int_struct->val1;
    int val2 = int_struct->val2;
    int val3 = int_struct->val3;
    int val4 = int_struct->val4;
    int val5 = int_struct->val5;
    int val6 = int_struct->val6;
    int val7 = int_struct->val7;

    return val1+val2+val3+val4+val5+val6+val7;
}
extern int val1, val2, val3, val4, val5, val6, val7;

int function(void)
{
    return val1+val2+val3+val4+val5+val6+val7;
}