数组大小到底是多少

Icy_Yisha 2009-08-13 06:23:12

最近看到这么一段代码:

static char memp_memory[MEM_ALIGNMENT - 1
#define MEMPOOL(name,num,size,desc) + ( (num) * (MEMP_SIZE + MEMP_ALIGN_SIZE(size) ) )
#include "memp_std.h"
];

到底数组memp_memory的大小是多少啊???这么写的目的是什么呢???
...全文
273 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
pmerOFc 2009-08-14
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 mymtom 的回复:]
引用 15 楼 pmerofc 的回复:
引用 14 楼 mymtom 的回复:

没有特别的意义,只是在这个例子中,
在#include "memp_std.h"
MEMPOOL宏就会展开为
+ 1234


理解您的意思了,谢谢

您觉得一定要这样么?
必要性在哪里?

IMHO:这时一种组织代码的方法(或者说是技巧,说技巧会被很多人不齿,所以用了括号),便于代码的维护:
只要在memp_std.h里
MEMPOOL("mymtom", 16, 1024, "")
就能自动定义出
memp_memory
了,而且可能还有其他的用处,这在写系统库或者操作系统的代码里很常见。
[/Quote]
多谢指教!
mymtom 2009-08-14
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 pmerofc 的回复:]
引用 14 楼 mymtom 的回复:

没有特别的意义,只是在这个例子中,
在#include "memp_std.h"
MEMPOOL宏就会展开为
+ 1234


理解您的意思了,谢谢

您觉得一定要这样么?
必要性在哪里?
[/Quote]
IMHO:这时一种组织代码的方法(或者说是技巧,说技巧会被很多人不齿,所以用了括号),便于代码的维护:
只要在memp_std.h里
MEMPOOL("mymtom", 16, 1024, "")
就能自动定义出
memp_memory
了,而且可能还有其他的用处,这在写系统库或者操作系统的代码里很常见。
CCM163 2009-08-13
  • 打赏
  • 举报
回复
学习中,目前没有遇到这种情况
qwegis 2009-08-13
  • 打赏
  • 举报
回复
看看
pmerOFc 2009-08-13
  • 打赏
  • 举报
回复
我10楼的发言有误
向楼主表示歉意

第一个#没意义
第二个#留下了memp_std.h里的内容

谢谢mymtom的指正
pmerOFc 2009-08-13
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 mymtom 的回复:]

没有特别的意义,只是在这个例子中,
在#include "memp_std.h"
MEMPOOL宏就会展开为
+ 1234

[/Quote]
理解您的意思了,谢谢

您觉得一定要这样么?
必要性在哪里?
mymtom 2009-08-13
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 pmerofc 的回复:]
引用 11 楼 mymtom 的回复:
引用 9 楼 mymtom 的回复:
定义了一个MEMPOOL宏定义,当然是要用的。
MEMP_ALIGN_SIZE(x) 从名字看,就是根据机器字长,计算对齐后的size

注意到MEMPOOL这个带参数的宏以一个加号"+"开头,明显就是要跟在MEM_ALIGNMENT - 1后面,
从这点出发就好理解了。

没理解您的意思
+在带参数的宏里有特别的意义么?

[/Quote]
没有特别的意义,只是在这个例子中,
在#include "memp_std.h"
MEMPOOL宏就会展开为
+ 1234
用两次就会展开为
+ 1234
+ 5678
最终
static char memp_memory[MEM_ALIGNMENT - 1
#define MEMPOOL(name,num,size,desc) + ( (num) * (MEMP_SIZE + MEMP_ALIGN_SIZE(size) ) )
#include "memp_std.h"
];
结果就是
static char memp_memory[MEM_ALIGNMENT - 1
+ 1234
+ 5678
];
这就好理解了。就那俺在 8 楼的例子来说,用gcc -E的输出是:

# 418 "/usr/include/stdio.h" 3 4
extern int __isthreaded;
# 452 "/usr/include/stdio.h" 3 4

# 2 "051.c" 2





static char memp_memory[4 - 1

# 1 "memp_std.h" 1







+ ((16) * (16 + (((1024) + 3) / 4 * 4)))
# 10 "051.c" 2
];

int
main(int argc, char *argv[])
{
(void)printf("%d\n", (int)sizeof(memp_memory));
return 0;
}

楼主想知道的展开结果就是:

static char memp_memory[4 - 1
+ ((16) * (16 + (((1024) + 3) / 4 * 4)))
];

这个就好计算了嘛。
jinwei1984 2009-08-13
  • 打赏
  • 举报
回复
关注
pmerOFc 2009-08-13
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 mymtom 的回复:]
引用 9 楼 mymtom 的回复:
定义了一个MEMPOOL宏定义,当然是要用的。
MEMP_ALIGN_SIZE(x) 从名字看,就是根据机器字长,计算对齐后的size

注意到MEMPOOL这个带参数的宏以一个加号"+"开头,明显就是要跟在MEM_ALIGNMENT - 1后面
从这点出发就好理解了。
[/Quote]
没理解您的意思
+在带参数的宏里有特别的意义么?
mymtom 2009-08-13
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 mymtom 的回复:]
定义了一个MEMPOOL宏定义,当然是要用的。
MEMP_ALIGN_SIZE(x) 从名字看,就是根据机器字长,计算对齐后的size
[/Quote]
注意到MEMPOOL这个带参数的宏以一个加号"+"开头,明显就是要跟在MEM_ALIGNMENT - 1后面,
从这点出发就好理解了。
pmerOFc 2009-08-13
  • 打赏
  • 举报
回复
预处理是先进行的
等编译的时候
这些
#define MEMPOOL(name,num,size,desc) + ( (num) * (MEMP_SIZE + MEMP_ALIGN_SIZE(size) ) )
带#的东西已经没有了
所以编译的是没有#……的代码
要是没有那两行#……
我想楼主不难看出数组的大小吧
mymtom 2009-08-13
  • 打赏
  • 举报
回复
定义了一个MEMPOOL宏定义,当然是要用的。
MEMP_ALIGN_SIZE(x) 从名字看,就是根据机器字长,计算对齐后的size
mymtom 2009-08-13
  • 打赏
  • 举报
回复
当然是有意义的,memp_std.h应该类似下面这样

#include <stdio.h>

#define MEMP_SIZE 16
#define MEMP_ALIGN_SIZE(x) (((x) + 3) / 4 * 4)
#define MEM_ALIGNMENT 4

static char memp_memory[MEM_ALIGNMENT - 1
#define MEMPOOL(name,num,size,desc) + ((num) * (MEMP_SIZE + MEMP_ALIGN_SIZE(size)))
#include "memp_std.h"
];

int
main(int argc, char *argv[])
{
(void)printf("%d\n", (int)sizeof(memp_memory));
return 0;
}
/*
* memp_std.h
*/

#ifndef MEMP_STD_H
#define MEMP_STD_H

MEMPOOL("mymtom", 16, 1024, "")

#endif /* MEMP_STD_H */
pmerOFc 2009-08-13
  • 打赏
  • 举报
回复
我觉得是作者在故弄玄虚
liao05050075 2009-08-13
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 annie_2009 的回复:]
这是一个开源代码里的,我在想是不是作者为了方便别人移植才这么写的呢?
[/Quote]
那个作者有没有留下email的?发个信问一下。
ies_sweet 2009-08-13
  • 打赏
  • 举报
回复
以 “#”开头的貌似都表示预处理语法

所以呢,这一行由预处理器来搞定,
预处理器把以 # 开头的这一行来分析就成了,只要没有
行连接符号 \ 那么就只处理这一行

而编译器呢,当发现以 # 开始的这一行时,就会忽略这一行
当然它会检查是否存在行连接符号 \
如果有,就把连接的下面的行也忽略了

不过呢,这样的写法只是在玩弄语法,
实在不是好的风格呢。
Icy_Yisha 2009-08-13
  • 打赏
  • 举报
回复
类似的我还看到:
static const unsigned short int memp_num[MEMP_MAX] = {
#define MEMPOOL(name,num,size,desc) (num),
#include "memp_std.h"
};

这是一个开源代码里的,我在想是不是作者为了方便别人移植才这么写的呢?
liao05050075 2009-08-13
  • 打赏
  • 举报
回复
这个我不清楚。
不过我试了一下,发现那两行没影响。按理说,应该移到]外面的

#include <stdio.h>
#define MEM_ALIGNMENT 10
static char memp_memory[MEM_ALIGNMENT - 1
#define MEMPOOL(name,num,size,desc) + ( (num) * (MEMP_SIZE + MEMP_ALIGN_SIZE(size) ) )
#include "stdio.h"
];


int main(void)
{
printf("%d\n",sizeof(memp_memory));
}

输出9
Icy_Yisha 2009-08-13
  • 打赏
  • 举报
回复
#define MEMPOOL(name,num,size,desc) + ( (num) * (MEMP_SIZE + MEMP_ALIGN_SIZE(size) ) )
#include "memp_std.h"

写在[]里的目的是什么呢?
liao05050075 2009-08-13
  • 打赏
  • 举报
回复
MEM_ALIGNMENT 是一个宏定义的常数,memp_memory的大小就是它减去1嘛

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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