我有一个这样的数据 struct :

struct foo {
    int id;
    int route;
    int backup_route;
    int current_route;
}

还有一个名为update()的函数,用于请求对其进行更改.

update(42, dont_care, dont_care, new_route);

这真的很长,如果我在 struct 中添加了一些东西,我必须在每次调用update(.)时都添加一个‘not_care’.

我正在考虑将其传递给一个 struct ,但是事先在 struct 中填充"don_care"比在函数调用中拼写它更繁琐.我可以在某个地方创建默认值为dont care的 struct ,并在将其声明为局部变量后设置我关心的字段吗?

struct foo bar = { .id = 42, .current_route = new_route };
update(&bar);

将我想要表达的信息传递给update函数的最好方式是什么?

我还想让其他一切都默认为-1("不在乎"的密码)

推荐答案

虽然宏和/或函数(如前所述)可以工作(并且可能有其他积极的影响(例如,调试挂钩)),但它们比所需的要复杂得多.最简单也可能是最优雅的解决方案是只定义一个用于变量初始化的常量:

const struct foo FOO_DONT_CARE = { // or maybe FOO_DEFAULT or something
    dont_care, dont_care, dont_care, dont_care
};
...
struct foo bar = FOO_DONT_CARE;
bar.id = 42;
bar.current_route = new_route;
update(&bar);

这段代码实际上没有理解间接寻址的思想开销,而且非常清楚在bar中明确设置了哪些字段,而(安全地)忽略了那些未设置的字段.

C++相关问答推荐

如何用C(使用两个s补数算术的32位程序)计算

segfault在C中使用getline()函数

字符串令牌化xpath表达式

MISRA C:2012 11.3违规强制转换(FLOAT*)到(uint32_t*)

当我运行/调试C程序时,Malloc()似乎正在将&q;r\r...&q;赋值给一个指针,我不确定为什么?

为什么GDB/MI进程的FIFO循环中有read()阻塞

如何在C中打印包含扫描字符和整数的语句?

对于C中给定数组中的每个查询,如何正确编码以输出给定索引范围(1到N)中所有数字的总和?

C代码在字符串中删除不区分大小写的子字符串的问题

在编写代码时,Clion比vscode有更多的问题指示器

收到不兼容的指针类型警告,因为函数的返回不是空*,而是 struct 指针

如何在双向表中实现线程安全,每个条目仅使用4位,同时避免任何全局锁?

C";中的ANN运行时判断失败#2-变量outputLayer;周围的堆栈已损坏.运行后出错

C程序向服务器发送TCPRST

为什么GCC-O1优化破解了这个代码,为了一个GameBoy高级只读存储器而修改了VRAM的循环?

使用C++中的字符串初始化 struct 时,从‘char*’初始化‘char’使指针变为整数,而不进行强制转换

在NASM中链接Linux共享库时出错-';将R_ X86_64_;foo';

为什么孤儿进程在 Linux 中没有被 PID 1 采用,就像我读过的一本书中声称的那样?

'printf("%s", user_input)' 危险吗?

SSE 向量与 Epsilon 的比较