与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) {}
}
为什么NUM为0呢,我想把所有的全局定义放在.c中,在.h里声明,其中就遇到这种sizeof的宏, 这个使用sizeof的方式,在MDK4.74里面无法定义通过。
而放在一个文件里面可以:
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:}
目前采用的方法就是直接把数组放在头文件里,仅包含一次头文件,但是终归不是太恰当,还是希望有中规中矩的写法 可以定义一个宏定义,这种方式在各种库里面比较流行。
#define COUNTOF(a) (sizeof(a) / sizeof(a))
以后直接使用调用COUNTOF即可,是否满足你的要求。 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求不出正常的值,要么就是语法错误
drifting1024 发表于 2018-6-7 09:40
嗯,谢谢答复。
这种定义也不行。
我之前上传的代码错了,应该是#define NUM(a) (sizeof(a)/sizeof(a
你放在一个文件里面就挺方便的,这个宏定义就放在其他文件。我们配置摄影头等寄存器多的外设时,就用的这种方式。一堆寄存器和相关函数都是在这个驱动文件下 eric2013 发表于 2018-6-8 00:29
你放在一个文件里面就挺方便的,这个宏定义就放在其他文件。我们配置摄影头等寄存器多的外设时,就用的这 ...
好的吧,只能这样啦,谢谢大龙猫:victory:
页:
[1]