顺便聊一下基础知识 | 每日一面(14)

古代的剑客们与

对手相逢时,无

论对手多么强大,

明知不敌,也要亮出自己的剑!

读者:是否有自动比较结构的方法?

小林:没有。编译器没有简单的好办法实现结构比较 (即, 支持结构的 == 操作符),这也符合 C 的低层特性。简单的按字节比较会由于结构中没有用到的 “空洞” 中的随机数据而失败; 而按域比较在处理大结构时需要难以接受的大量重复代码。如果你需要比较两个结构, 你必须自己写函数按域比较。

读者:如何向接受结构参数的函数传入常数值?

小林:传统的 C 没有办法生成匿名结构值; 你必须使用临时结构变量或一个小的结构生成函数。C99 标准引入了 “复合常量” (compound literals); 复合常量的一种形式就可以允许结构常量。例如, 向假想 plotpoint() 函数传入一个坐标对常数, 可以调用plotpoint((struct point){1, 2});与 “指定初始值” (designated initializers) (C99 的另一个功能) 结合, 也可以用成员名称确定成员值:plotpoint((struct point){.x=1, .y=2});

有时候,正是那些意想不到之人,成就了无人能成之事。

——图灵

正文完