为什么声明一个只包含C中数组的结构?
我碰到一些包含以下内容的代码:
struct ABC { unsigned long array[MAX]; } abc;
什么时候使用这样的声明是有道理的?
它允许您通过值将数组传递给函数,或者通过函数的值返回数组。
结构可以通过值来传递,而不像在这些上下文中衰减为指针的数组。
另一个优点是它将大小抽象出来,所以无论你声明这样一个对象,你都不必在整个代码中使用[MAX]
。 这也可以通过
typedef char ABC[MAX];
但是你有一个更大的问题:你必须知道ABC
是一个数组types(尽pipe当你声明ABC
types的variables时你看不到),否则你会被ABC
在函数参数列表中与variables声明/定义中的含义不同。
还有一个好处是,结构允许你稍后添加更多的元素,如果你需要,而不必重写大量的代码。
您可以复制一个结构并从一个函数返回一个结构。
你不能用数组来做这件事 – 除非它是一个结构的一部分!
你可以像这样复制它。
struct ABC a, b; ........ a = b;
对于数组,您需要使用memcpy函数或循环来分配每个元素。
你可以使用struct来创build一个新types的数据,比如string 。 你可以定义:
struct String { char Char[MAX]; };
或者你可以创build一个数据列表 ,你可以通过函数的参数来使用它,或者在你的方法中返回它。 该结构比数组更灵活,因为它可以支持像=这样的操作符,并且可以在其中定义一些方法。
希望它对你有用:)
一个结构可以包含数组初始化,复制和fini函数,模拟OOP内存pipe理范例的一些优点。 实际上,扩展这个概念非常容易,可以编写一个通用的内存pipe理工具(通过使用sizeof()结构来确切地知道有多less字节被pipe理)来pipe理任何用户定义的结构。 许多以C语言编写的智能生产代码库使用了这些代码,并且通常不会使用数组,除非它的范围很局部。
事实上,对于一个embedded到结构中的数组,你可以做其他“聪明的事情”,比如在你想要访问这个数组的时候进行绑定检查。 同样,除非数组范围非常有限,否则使用它并在程序间传递信息是一个坏主意。 迟早,你会遇到一些错误,让你在晚上醒来,毁了你的周末。
使用这样的struct
另一个优点是,只要使用了这样的struct
,它就可以实现types安全 ; 特别是如果您有两种types的大小相同的数组用于不同的目的,这些types将帮助您避免不小心使用数组不恰当的使用数组。
如果你没有在一个struct
包装一个数组,你仍然可以为它定义一个typedef
:这具有结构的一些优点 – types被声明一次,大小自动改正,代码的意图变成更清晰,代码更易于维护 – 但是会失去◦严格的types安全性,◦能够复制和返回types的值,以及◦能够在不破坏代码的其余部分的情况下添加成员。 给定types的裸数组的两个typedef
只有在大小不同时才会产生不同的types。 而且,如果在函数参数中使用不带*
的typedef
,则相当于char *
,大大降低了types安全性。
总结 :
typedef struct A_s_s { char m[113]; } A_s_t; // Full type safey, assignable typedef char A_c_t[113]; // Partial type-safety, not assignable A_s_t v_s(void); // Allowed A_c_t v_c(void); // Forbidden void s__v(A_s_t); // Type-safe, pass by value void sP_v(A_s_t *); // Type-safe void c__v(A_c_t); // UNSAFE, just means char * (GRRR!) void cP_v(A_c_t *); // SEMI-safe, accepts any array of 113