首页 新闻资讯 技术资料 论坛 网站地图
嵌入式硬件 SOPC 存储器 工业控制 嵌入式系统 软件开发 综合电子技术
电子元器件搜索:
IC库存(8958万) PDF资料(329万) IC价格 IC求购 资讯 技术资料
维库电子市场网是知名的电子元器件交易网站, 为电子生产企业提供IC库存和技术资料查询服务。
位置: 首页 > 详细信息
  请教宏定义的一个问题
出处:21ic 时间: 2007-11-06
xiezonglin 发布于 2007-9-23 21:46:00
向各位大侠请教一个问题。

我在a.c里定义了一个数组 char cUnitTab[]={...},由赋值确定数组长度,
在a.h中有下列内容
extern  char cUnitTab[];
#define UNITLEN sizeof(cUnitTab)
b.c包含a.h,使用UNITLEN 这个宏的时候提示返回0;
问题应该是a.h的变量声明中没有长度,但是由于cUnitTab的长度可能会因需要而变化,由赋值的内容决定,而且我希望维护这个程序时增加cUnitTab的内容时不用去考虑长度,由编译器自动给出。
请问,这个问题有什么好的解决办法吗?我试过一种方法是定义量会占用空间,并且在使用时很耗运行时间。


沈老 发布于 2007-9-24 20:24:00
#ifndef a_h // 为避免重复定义
#define a_h

#define UNITLEN sizeof(cUnitTab)

char cUnitTab[]={0,1,2,3,4,5,6};

#endif //a_h


xiezonglin 发布于 2007-9-24 21:00:00
头文件中好像不适合定义变量?


ayb_ice 发布于 2007-9-25 8:00:00
谁说的,我的项目所有全局变量都是在头文件中定义的...


xiezonglin 发布于 2007-9-30 23:10:00
别的文件包含了这个文件后就会再定义一个这个变量啊,然后就出错了,不知道您用什么方式?
#ifndef a_h // 为避免重复定义
#define a_h

这个也有加啊


yuanjian79 发布于 2007-10-9 20:51:00
全局变量定义在头文件,那么,两个c文件要包含一个头文件能编译通过吗?


zusen 发布于 2007-10-9 21:29:00
在头文件里定义变量是可行,,但这个头文件不能重复包含
用extern 定义外部变量就可以


emtionmk 发布于 2007-10-13 22:33:00
头文件不要定义变量,而只能声明,

因为在头文件定义变量时,当多个.c文件引用这个头文件时,会在多个.c文件中都定义这个变量的。即cUnitTab[]这个数组都每个.c中都会分配内存空间,且占用不同的地址。可以在变量前加extern声明


emtionmk 发布于 2007-10-13 23:12:00
试了一下,可以在a.h取消宏,加一个extern const int array_len;
然后在a.c中用 array_len = sizeof(cUnitTab)就行了

a.h 文件:
extern  char cUnitTab[];
extern const int array_len;

a.c文件:
char cUnitTab[]={.......};
array_len = sizeof(cUnitTab);

在b.c中调用array_len就相当于你那个UNITLEN 宏定义了


thw 发布于 2007-10-14 22:31:00
SIZEOF不是函数,是一个运算符,编译器在预编译阶段已经对SIZEOF的值进行了替换,如果你这样定义编译器是不知道该值是多少的。另外不定长的数组我印象中是不能定义为全局变量的,编译器应该会告警。

建议在你填入的内容后加入结束字符,比较容易算出数据的长度。


wishcom 发布于 2007-10-15 22:45:00
对于在头文件中定义变量,没有什么地方说不允许,但我还是要说:
如果你在头文件中定义变量,那么只能说明你没有大型项目的经验。。。。


eraychen 发布于 2007-11-6 19:58:00
比如在a.h文件这样定义

#ifndef _A_H_
#define _A_H_

#ifdef _A_C_
#define EXTERN
#else
#define EXTERN extern
#endif
定义变量:
EXTERN BYTE bParam;

#undef EXTERN
#endif
//////////////////////////////
在a.c文件里这样定义
#ifndef _A_C_
#define _A_C_

#include"a.h"
//////////////////////////////////

那么在a.c文件调用bParam就是变量了,而在其他包含a.h文件的文件里bParam就是外部变量了

这样的话,我觉得不管你的系统多大,都是没问题的,不知道为什么不可以???



关闭】 【打印
相关专题  
计算机外设
嵌入式系统
军工/航空航天
接口电路
SOPC
工业控制
电源系列
测试测量
综合电子技术
IC设计
嵌入式软件
嵌入式硬件
传感控制
汽车电子
数控系统
AD/DA
消费电子
开发工具
医疗电子
安防产品
应用产品
存储器
CPLD/FPGA
嵌入式开发新闻
软件开发

© 2007 百斯嵌入式开发网 网站地图