Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何根据条件简洁地分配给结构的成员?_C_If Statement_Struct_Initialization_C11 - Fatal编程技术网

C 如何根据条件简洁地分配给结构的成员?

C 如何根据条件简洁地分配给结构的成员?,c,if-statement,struct,initialization,c11,C,If Statement,Struct,Initialization,C11,我有一些代码如下所示: struct mystruct { /* lots of members */ }; void mystruct_init( struct mystruct* dst, int const condition ) { if ( condition ) { /* initialize members individually a certain way */ } else { /* initi

我有一些代码如下所示:

struct mystruct
{
    /* lots of members */
};

void mystruct_init( struct mystruct* dst, int const condition )
{
    if ( condition )
    {
        /* initialize members individually a certain way */
    }
    else
    {
        /* initialize members individually another way */
    }
}
void mystruct_init( struct mystruct* dst, int const condition )
{
    if ( condition )
        init_first_way(..);
    else
        init_second_way(..);
}
我正在考虑的选择:

  • 最简单的方法是让一个函数分配给每个成员并调用它。我应该仅仅希望编译器优化调用吗
  • 定义宏以显式避免函数调用开销
  • 写下所有的东西

在C11中处理这种情况的正确方法是什么?

只需编写一个初始化成员的函数,或者如果需要(基于意见),可以使用宏

顺便说一下,我个人会这样做:

struct mystruct
{
    /* lots of members */
};

void mystruct_init( struct mystruct* dst, int const condition )
{
    if ( condition )
    {
        /* initialize members individually a certain way */
    }
    else
    {
        /* initialize members individually another way */
    }
}
void mystruct_init( struct mystruct* dst, int const condition )
{
    if ( condition )
        init_first_way(..);
    else
        init_second_way(..);
}
或者只使用三元运算符。请记住,您关心可读性,并始终牢记:

简单是一种美德


我真的认为在这个阶段担心优化会成为不成熟优化的牺牲品,因为我怀疑这会成为瓶颈


一般来说,如果要优化代码,请分析代码(虽然代码运行时带有优化标志,但许多人不知道这一点,我就是其中之一:),找到瓶颈并尝试优化该瓶颈。

我认为这里没有任何明确的规则。对我来说,这取决于作者的品味

两个明显的方法是:

// initialize members that are independent of 'condition'

if (condition) {
  // initialize members one way
}
else {
  // initialize members another way
}
可将其写成:

// initialize members that are independent of 'condition'

// initialize members based on 'condition'
dst->memberx = condition ? something : something_else;
// ...

请不要担心一个函数调用的开销。

我同意已经发布的答案(@gsamaras和@Arun)。我只是想展示另一种方法,我已经发现它非常有用

方法是使用两个(或多个)相关的初始化值生成一些常量,然后根据一个(或多个)条件进行简单赋值

简单的例子:

#include<stdio.h>
#include <string.h>

struct mystruct
{
  int a;
  float b;
};

const struct mystruct initializer_a = { 1, 3.4 };
const struct mystruct initializer_b = { 5, 7.2 };

int main (void)
{
  int condition = 0;
  struct mystruct ms = condition ? initializer_a : initializer_b;
  printf("%d %f\n", ms.a, ms.b);
  return 1;
}
#包括
#包括
结构mystruct
{
INTA;
浮球b;
};
const struct mystruct初始值设定项_a={1,3.4};
const struct mystruct初始值设定项_b={5,7.2};
内部主(空)
{
int条件=0;
struct mystruct ms=条件?初始值设定项_a:初始值设定项_b;
printf(“%d%f\n”,ms.a,ms.b);
返回1;
}

您所拥有的一切都没有问题。可读性很重要。您可以将一些线吊出,例如
dst->foo=condition?5 : 7;但是考虑哪一个选项使读者更清楚地知道发生了什么和为什么。考虑使用“复合文本”和“指定的初始化器”:<代码> *DST=(Strut MyStult){ Meim1= Value1,.MeNe2= Value2,…};<如果
结构
需要为
常量
,则可以创建包含不同初始值设定项列表的多个宏,然后在它们之间创建
#ifdef
。虽然不漂亮,但别无选择。最后一句话触动了我的心,很好+1用于提及
不成熟的优化
。如前所述,过早优化是万恶之源:)[@Arun它不是关于优化,而是关于简洁性。我不太熟悉编译器优化,所以我不想不必要地使用效率较低的东西。不过,感谢你们两位指出这一点,这提醒了我,当我还没有测量时,不要再担心类似的事情。@user2296177去过那里,完成了t、 看我的编辑。我感觉到风让你问这个问题,这就是为什么我投了更高的票。