3878|10

83

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

请教关于sizeof的一个问题 [复制链接]

向各位大侠请教一个问题。

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

最新回复

求证了几个老大后,得到的结论是:sizeof只能对确切的声名结构取长度.而extern char a[]这个声名给出的信息不够完整. 另外在这本圣经里对sizeof的解释里有这么一句:此运算符不能用于函数类型和不完整的类型的操作数. 因此,extern char a[]这个不能给出完整信息的声明,编译器不主动去记录和猜测.它罢工了... 别说跨文件,哪怕是下面这个代码,sizeof也不能正常工作 //代码 #include extern char a[]; int main() {     printf("lenght :%d",sizeof(a)); } char a[] = "1,2,3,4,5"; //结束 想达到LZ的想法,用CPP到用时再定义,要么就只能重新实现编译器... 好运...  详情 回复 发表于 2007-9-26 12:54
点赞 关注

回复
举报

60

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
自己坐SF,希望各位多多支持,刚开始没什么分,请见谅。
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
忘了说明是Keil c51编译器
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

4
 
如果长度是程序中动态分配的,编译器怎么会知道呢?
动态分配的长度可定义变量来保存.

如果是编译时分配,则:
#define UNITLEN  123
extern  char cUnitTab[UNITLEN];

 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

5
 
char cUnitTab[]={...},由赋值确定数组长度,
在a.h中有下列内容
extern  char cUnitTab[];
#define UNITLEN sizeof(cUnitTab)

//LZ你的这种方式的确不行,可能是因为跨文件了的缘故


///////////////////////C文件//////////////////////
#include "text.h"
char array[] = {1,2,3,4,5,6,7,8,9};

int get()
{
        return LEN;
}

////////////////////H文件///////////////////////
extern char array[];
#define LEN sizeof(array)
extern int get();

这样偷偷地封装一层,没问题...
嘿嘿
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

6
 
楼上的方法似乎和我定义常量的方式差不多?因为是用51,因此我希望有更好的效率
比如有没什么办法定义一个常量,而使用这个常量时就好像使用常数一样?
 
 
 

回复

88

帖子

0

TA的资源

一粒金砂(初级)

7
 

如果长度是程序中动态分配的,编译器怎么会知道呢?
动态分配的长度可定义变量来保存.

如果是编译时分配,则:
#define UNITLEN  123
extern  char cUnitTab[UNITLEN];

/////////////////////////////////
我就是希望不用自己修改这个常数,因为希望不用每次修改数组时都要去数这个长度。
因为我的程序可能需要大量得使用这种数组。我怕维护难度比较大。
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

8
 
/////////////////////////////////
我就是希望不用自己修改这个常数,因为希望不用每次修改数组时都要去数这个长度。
因为我的程序可能需要大量得使用这种数组。我怕维护难度比较大。
--------
这样定义就是为了便于维护,宏定义放在公共头文件中,目的是无需修改多处引用,是很常规的做法.
其实你用sizeof计算char型的长度没有太大的意义,直接用宏定义清晰简洁,易于理解和维护.

如果是动态分配则是另外一回事.
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

9
 
这样定义就是为了便于维护,宏定义放在公共头文件中,目的是无需修改多处引用,是很常规的做法.
其实你用sizeof计算char型的长度没有太大的意义,直接用宏定义清晰简洁,易于理解和维护.

如果是动态分配则是另外一回事.
/////////////////////////////////
我这边的数组主要用于查表,因此,我需要判断这个表格的长度,而我是希望我这个表格内容改变导致长度改变时我其它地方都不用修改,用你这种方法时我还需要再修改一下这个宏定义。
当我的数组很多时这个维护就变得比较麻烦。
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

10
 
开始时我没细看,误会你的意思了,你按lbing7的方法试试.
不过自己手工算一下长度放在头文件中也不是很麻烦啊.
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

11
 
求证了几个老大后,得到的结论是:sizeof只能对确切的声名结构取长度.而extern char a[]这个声名给出的信息不够完整.

另外在这本圣经里对sizeof的解释里有这么一句:此运算符不能用于函数类型和不完整的类型的操作数.

因此,extern char a[]这个不能给出完整信息的声明,编译器不主动去记录和猜测.它罢工了...

别说跨文件,哪怕是下面这个代码,sizeof也不能正常工作

//代码
#include
extern char a[];

int main()
{
    printf("lenght :%d",sizeof(a));
}

char a[] = "1,2,3,4,5";

//结束

想达到LZ的想法,用CPP到用时再定义,要么就只能重新实现编译器...
好运...
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表