外部数组数组声明,请教

koral 2008-01-17 04:10:27
我遇到如下问题不能很好的解决:
在VS2003同一个项目中有:
文件: TD.h :里面是数组元素类型声明,typedef XXXXX ARRY_ELEMENT;
文件:IA.cpp:包含头文件TD.h,定义了一个数组,因为元素特别多而且不固定数目,所以有有这样的定义:

#include "TD.h"
ARRY_ELEMENT aM[]={E1,E2,...,En};
int GetTableSize(){
return sizeof(aM);
}

文件:IB.cpp:包含头文件TD.h,对数组aM[]进行引用,声明如:extern ARRY_ELEMENT aM[];引用该数组的时候有问题,问题如下:

#include "TD.h"
int GetTableSize();
extern ARRY_ELEMENT aM[];
void Foo1(){
int iEleNum=sizeof(aM)/sizeof(ARRY_ELEMENT);
for(int i=0;i<iEleNum;i++){
Foo2(aM[i]);
}
}

编译通不过,提示对zM是无效的 sizeof 关键字运用;如果将之换成函数GetTableSize的调用则没问题。

因为数组aM的元素特别多,而且元素类型不是很大,所以我把它的定义成数组并放在一个单独的文件;但是因为是变长的,所以没有指定长度(并非运行时变长,否则我就用别的来代替数组了,比如STL的arry)。解决的方法:如果IA和IB合并的话,文件就太乱了;如果指定数组长度,我就得把元素个数计算出来。这两样方法都很麻烦,我的解决办法是,在IA中定义一个函数用来返回不定长数组aM的大小,用的是sizeof关键字,然后在IB引用该函数,这样aM就可以按要求定义成不定长的数组放在单独文件中了。但是代价是它的后面必须跟一个返回它的大小的函数,看这别扭;定义成类更别扭。不知道有没有好的解决方法?
...全文
542 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
koral 2008-01-17
  • 打赏
  • 举报
回复
哦哦,7楼说的是。我的项目还有个情况就是,类似aM的数组可能还会有,所以当每添加一个这样的数组就得维护一个类似
GetTableSize的函数;好似类的静态成员方法封的好,如果这样的话我干脆把对该数组的操作都封装到一个类里——其实我们
正在这么做,只是这个类不是我全部负责,我只负责生成这个编译期数组,要的就是精简。

boost,还没时间研究哎。
谢谢各位先
ltc_mouse 2008-01-17
  • 打赏
  • 举报
回复
sizeof(aM)/sizeof(ARRY_ELEMENT)
=================================
没感觉这种做法比GetTableSize优雅呀;个人认为,用函数更容易应付数组aM的变化啊,改动aM,并不需要其他使用aM的模块重新编译。
定义成类的静态成员,是多个类实例共享这个static数组的,不会增加额外的内存消耗吧。
taodm 2008-01-17
  • 打赏
  • 举报
回复
那么,你可以去看看boost::preprocessor库,BOOST_PP_SEQ_SIZE/BOOST_PP_SEQ_ENUM
koral 2008-01-17
  • 打赏
  • 举报
回复
哦,只是这个项目不是我一个人做,所以要顾及他人的方便才好。我以为应该有更优雅的方法
taodm 2008-01-17
  • 打赏
  • 举报
回复
习惯就好了。不要太“洁癖”。
其实它是一个很好的解。
koral 2008-01-17
  • 打赏
  • 举报
回复
to taodm:
现在还没有好的解决办法,只好用着GetTableSize;我就是觉得后面拖这这个函数太别扭了,想去掉它。
to dizuo :
这个数组的元素大小大约是30几个字节,但是元素数量有上万个。定义成静态类成员没有内存空间占用问题么?
ryfdizuo 2008-01-17
  • 打赏
  • 举报
回复
定义成类更别扭。
--------
全局变量最好都放到类:比如Global里面,并且全部定义成静态成员。
使用的时候只要包含Global头文件,就可以调用,Global::Size()获得大小,Global::aM[]获得数组成员;
...
taodm 2008-01-17
  • 打赏
  • 举报
回复
使用GetTableSize函数呀。

64,685

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧