作者:Andou1983 | 来源:互联网 | 2023-06-29 09:27
我们公司的编码规范上说:数组不能直接定义为全局变量,只能定义为数组指针,申请动态内存。但我在代码中常见有人这样写:源文件init_table.ctypedefstruct
我们公司的编码规范上说:
数组不能直接定义为全局变量,只能定义为数组指针,申请动态内存。
但我在代码中常见有人这样写:
//源文件 init_table.c
typedef struct
{
uint8 state;
uint8 dial_role;
uint8 dial_status;
uint16 errcode;
DID_T diaid; //结构变量
uint8 invk_ind_count;
INVK_OP_T invk_ind[MAX_INVOKE_NUM]; //结构数组
uint8 invk_req_count;
INVK_OP_T invk_req[MAX_INVOKE_NUM]; //结构数组
uint8 linkid_flag;
uint8 link_id;
uint8 app_ssn;
uint8 map_peer_ssn;
uint32 app_serial_id;
uint16 app_event_id;
uint32 timer_no;
uint8 timer_type;
uint16 primitive;
uint8 count;
ADDR_T orig_addr; //结构变量
ADDR_T dest_addr; //结构变量
uint16 flink;
uint8 r11;
}DIALOG_TBL_T;
#define MAX_DIALOG_ID 3000
DIALOG_TBL_T dialtbl[MAX_DIALOG_ID]; //这里dialtbl是个大的结构数组,其中结构还嵌套着结构,把它定义为一个全局变量,是不是不符合规范呢?那规范有什么好处呢?
如果照规范做,应该怎么做一下?
是不是动态申请:
DIALOG_TBL_T *dialtbl = (DIALOG_TBL_T *)malloc(size(DIALOG_TBL_T)*3000 + 1);
8 个解决方案
我觉得不能死抠规范,某些时候这些数组的生命期确实很长,甚至跨越整个任务的生命期,并且这些数组具有公共的特性,对各个模块都有作用。这个时候声明为全局变量未尝不可。
不清楚你们公司的规范是不是针对某些平台的特殊需求进行的定义,也许只是为了限制全局变量的数量而已。
公司代码是跑在单板上的,可能也有这个原因!
主要是这个结构数组确实很大,结构里面又套结构,所以定义为全局变量,是不是对全局变量所存放的区域(是什么区我也不太清楚,请高人给指点一下)有影响呢?
能有人再给说说吗?
结构数组很大,结构里面又套结构,定义为全局变量,是不是对全局变量所存放的区域有影响呢?
我的一点初浅看法:
全局变量存放在静态数据区,malloc存放在堆空间。
一般来说,操作系统对进程的栈和静态存储区都有大小限制,而堆空间基本上只受到实际物理内存(含虚拟内存或交换区)的限制。因此,大的数据量都不要定义成全局变量。
全局变量的危害还在于破坏模块的独立性,增加模块间的耦合性。因此,一般只使用单个模块间的全局变量,而不使用多个模块都能访问的全局变量。如果万一要让多个模块共享全局变量,也尽量只让一个模块创建和写入,而其它模块只读。否则会给程序带来不稳定性,也难以维护修改。
简单的说,如果满足以下几种情况,可以使用全局变量:
1。数据量不大
2。只在一个功能模块内起作用,即“局部全局变量”,(很拗口,呵呵)
3。如果多个模块共享一个全局变量,让它只能被一个模块修改,其它只读。
否则,还是尽量放到堆栈上去,采用参数传递。
公司的编码规范上 是死的人是活的。
有需要当然可以做啊,不要泛滥即可
hqx8211
呵呵,不要在意,我是对CSDN上的这个给分制度不太熟悉,所以我就没有给分,你的回答让我和许多人都受益了,谢谢你.争取下次我也免费回答你一个问题:)