打印

请教宏定义的一个问题

[复制链接]
1967|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xiezonglin|  楼主 | 2007-9-23 21:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
向各位大侠请教一个问题。

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

相关帖子

沙发
xiezonglin|  楼主 | 2007-9-23 21:47 | 只看该作者

忘了说明,是keil c编译器

使用特权

评论回复
板凳
computer00| | 2007-9-23 22:43 | 只看该作者

好象没有,只好定义一个长度了。

使用特权

评论回复
地板
ayb_ice| | 2007-9-24 08:05 | 只看该作者

要么初始化,要么直接初始化....

使用特权

评论回复
5
沈老| | 2007-9-24 20:24 | 只看该作者

可以这样

#ifndef a_h // 为避免重复定义
#define a_h

#define UNITLEN sizeof(cUnitTab)

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

#endif //a_h

使用特权

评论回复
6
xiezonglin|  楼主 | 2007-9-24 21:00 | 只看该作者

沈老,UNITLEN 是在头文件中定义的

头文件中好像不适合定义变量?

使用特权

评论回复
7
ayb_ice| | 2007-9-25 08:00 | 只看该作者

"头文件中好像不适合定义变量?"

谁说的,我的项目所有全局变量都是在头文件中定义的...

使用特权

评论回复
8
xiezonglin|  楼主 | 2007-9-30 23:10 | 只看该作者

真的可以吗?

别的文件包含了这个文件后就会再定义一个这个变量啊,然后就出错了,不知道您用什么方式?
#ifndef a_h // 为避免重复定义
#define a_h 

这个也有加啊

使用特权

评论回复
9
yuanjian79| | 2007-10-9 20:51 | 只看该作者

头文件一般用来做接口声明用,而不是定义

全局变量定义在头文件,那么,两个c文件要包含一个头文件能编译通过吗?

使用特权

评论回复
10
zusen| | 2007-10-9 21:29 | 只看该作者

楼上说的是

在头文件里定义变量是可行,,但这个头文件不能重复包含
用extern 定义外部变量就可以

使用特权

评论回复
11
emtionmk| | 2007-10-13 22:33 | 只看该作者

头文件不要定义变量

头文件不要定义变量,而只能声明,

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

使用特权

评论回复
12
emtionmk| | 2007-10-13 23:12 | 只看该作者

试了一下,应该可以用这个方法

试了一下,可以在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 宏定义了

使用特权

评论回复
13
thw| | 2007-10-14 22:31 | 只看该作者

你这么定义是不可以的。。。

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

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

使用特权

评论回复
14
wishcom| | 2007-10-15 22:45 | 只看该作者

头文件不要定义变量

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

使用特权

评论回复
15
eraychen| | 2007-11-6 19:58 | 只看该作者

头文件应该是可以定义变量的

比如在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就是外部变量了

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

使用特权

评论回复
16
xiezonglin|  楼主 | 2007-12-30 21:47 | 只看该作者

我要是定义的时候赋值就不行了吧

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

这样的话,我觉得不管你的系统多大,都是没问题的,不知道为什么不可以???
*************************************************
我要是定义的时候赋初值,那样就有问题了吧?
因为我定义的是常量啊.而且是一个数组

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

43

帖子

0

粉丝