drifting1024 发表于 2018-6-5 13:55:06

与SIZEOF有关的宏

//test.c
#include "test.h"

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

extern int a[];

#define NUM sizeof(a)/sizeof(a)

#endif
//Main.c
#include <stdio.h>
#include <assert.h>
#include "test.h"
int main()
{
        printf("%d\n",NUM);
        while (1) {}
       
}

drifting1024 发表于 2018-6-5 13:56:36

为什么NUM为0呢,我想把所有的全局定义放在.c中,在.h里声明,其中就遇到这种sizeof的宏,

eric2013 发表于 2018-6-6 01:22:21

这个使用sizeof的方式,在MDK4.74里面无法定义通过。



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



drifting1024 发表于 2018-6-6 10:10:52

eric2013 发表于 2018-6-6 01:22
这个使用sizeof的方式,在MDK4.74里面无法定义通过。




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

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

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

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

drifting1024 发表于 2018-6-6 10:34:36

目前采用的方法就是直接把数组放在头文件里,仅包含一次头文件,但是终归不是太恰当,还是希望有中规中矩的写法

eric2013 发表于 2018-6-7 03:03:09

可以定义一个宏定义,这种方式在各种库里面比较流行。
#define COUNTOF(a)          (sizeof(a) / sizeof(a))

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

drifting1024 发表于 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)),和你的是一样的。
我举个栗子{:3:}
就拿你的来说printf("%d",COUNTOF(a));
我发现    数组a   必须与   printf语句(或者任意调用该宏的语句)在同一个源文件里,否则的话,要么是sizeof求不出正常的值,要么就是语法错误

eric2013 发表于 2018-6-8 00:29:57

drifting1024 发表于 2018-6-7 09:40
嗯,谢谢答复。
这种定义也不行。
我之前上传的代码错了,应该是#define NUM(a) (sizeof(a)/sizeof(a

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

drifting1024 发表于 2018-6-8 09:27:47

eric2013 发表于 2018-6-8 00:29
你放在一个文件里面就挺方便的,这个宏定义就放在其他文件。我们配置摄影头等寄存器多的外设时,就用的这 ...

好的吧,只能这样啦,谢谢大龙猫:victory:
页: [1]
查看完整版本: 与SIZEOF有关的宏