硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2054|回复: 8
收起左侧

与SIZEOF有关的宏

[复制链接]

15

主题

56

回帖

275

积分

高级会员

积分
275
发表于 2018-6-5 13:55:06 | 显示全部楼层 |阅读模式
  1. //test.c
  2. #include "test.h"

  3. int a[] = {1,2,3};
复制代码
  1. //test.h
  2. #ifndef _TEST_H
  3. #define _TEST_H
  4. #include <stdio.h>

  5. extern int a[];

  6. #define NUM sizeof(a)/sizeof(a[0])

  7. #endif
复制代码
  1. //Main.c
  2. #include <stdio.h>
  3. #include <assert.h>
  4. #include "test.h"
  5. int main()
  6. {
  7.         printf("%d\n",NUM);
  8.         while (1) {}
  9.        
  10. }
复制代码

回复

使用道具 举报

15

主题

56

回帖

275

积分

高级会员

积分
275
 楼主| 发表于 2018-6-5 13:56:36 | 显示全部楼层
为什么NUM为0呢,我想把所有的全局定义放在.c中,在.h里声明,其中就遇到这种sizeof的宏,
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106771
QQ
发表于 2018-6-6 01:22:21 | 显示全部楼层
这个使用sizeof的方式,在MDK4.74里面无法定义通过。
QQ截图20180606012213.png


而放在一个文件里面可以:
4.png

QQ截图20180606012640.png
回复

使用道具 举报

15

主题

56

回帖

275

积分

高级会员

积分
275
 楼主| 发表于 2018-6-6 10:10:52 | 显示全部楼层
eric2013 发表于 2018-6-6 01:22
这个使用sizeof的方式,在MDK4.74里面无法定义通过。

在VS里可以通过,但是sizeof返回0,所以我现在想问有没有方法可以跨文件使用带sizeof的宏啊,或者说有没有其他的办法可以通过调用宏(跨文件)来求数组元素。
我在网上看了用地址差值的办法:
  1. //example
  2. int a[]={1,2,3};
  3. #define size(x) ((char*)(&x+1) - (char*)(&x))

  4. printf("%d\n",size(a)/sizeof(int));
复制代码
但是这种方法也仅限于同一个文件中,一旦分开放置,&X就会报语法错误

工程需要把emwin的Dialog界面尽量简化,只保留emwin本身的代码,之前我定义的图片的数组 BITMAP *元素有几百个(&bm_xxx),
放在主程序文件里面代码很凌乱,所以现在要把它移出去

由于其中运用到了很多求大小的宏
  1. //
  2. XXX BITMAP* Array[]=
  3. {
  4. ......
  5. };
  6. #define xxx_NUM GUI_COUNTOF(Array)
复制代码
现在就出现了这种情况,sizeof直接失效了
直接用常数来define宏又感觉太不方便了
回复

使用道具 举报

15

主题

56

回帖

275

积分

高级会员

积分
275
 楼主| 发表于 2018-6-6 10:34:36 | 显示全部楼层
目前采用的方法就是直接把数组放在头文件里,仅包含一次头文件,但是终归不是太恰当,还是希望有中规中矩的写法
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106771
QQ
发表于 2018-6-7 03:03:09 | 显示全部楼层
可以定义一个宏定义,这种方式在各种库里面比较流行。
#define COUNTOF(a)          (sizeof(a) / sizeof(a[0]))

以后直接使用调用COUNTOF即可,是否满足你的要求。
回复

使用道具 举报

15

主题

56

回帖

275

积分

高级会员

积分
275
 楼主| 发表于 2018-6-7 09:40:12 | 显示全部楼层
eric2013 发表于 2018-6-7 03:03
可以定义一个宏定义,这种方式在各种库里面比较流行。
#define COUNTOF(a)          (sizeof(a) / sizeof( ...

嗯,谢谢答复。
这种定义也不行。
我之前上传的代码错了,应该是#define NUM(a) (sizeof(a)/sizeof(a[0])),和你的是一样的。
我举个栗子
就拿你的来说  printf("%d",COUNTOF(a));
我发现    数组a   必须与   printf语句(或者任意调用该宏的语句)在同一个源文件里,否则的话,要么是sizeof求不出正常的值,要么就是语法错误
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106771
QQ
发表于 2018-6-8 00:29:57 | 显示全部楼层
drifting1024 发表于 2018-6-7 09:40
嗯,谢谢答复。
这种定义也不行。
我之前上传的代码错了,应该是#define NUM(a) (sizeof(a)/sizeof(a[0 ...

你放在一个文件里面就挺方便的,这个宏定义就放在其他文件。我们配置摄影头等寄存器多的外设时,就用的这种方式。一堆寄存器和相关函数都是在这个驱动文件下
回复

使用道具 举报

15

主题

56

回帖

275

积分

高级会员

积分
275
 楼主| 发表于 2018-6-8 09:27:47 | 显示全部楼层
eric2013 发表于 2018-6-8 00:29
你放在一个文件里面就挺方便的,这个宏定义就放在其他文件。我们配置摄影头等寄存器多的外设时,就用的这 ...

好的吧,只能这样啦,谢谢大龙猫
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-5 13:07 , Processed in 0.222035 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表