#define宏中定义的变量大小是多少?

时间:2017-06-20 15:52:55

标签: c

array[0]

这是我的一些示例代码。数组是整数类型。所以,TOTAL_ELEMENTS也是一个整数。整数除以整数应该产生一个整数。但是,当我尝试使用sizeof()运算符查找create or replace function Date(EffDt varchar,EffDt varchar) RETURNS VARCHAR STABLE AS $$ from dateutil.parser import parse import datetime from datetime import timedelta if len(EffDt)>0 and len(Pay)>0: dt=parse(EffDt) if dt.month and dt.day==1: NewDate=dt else: if Pay=="Weekely": value=datetime.date(dt.year, dt.month, dt.day).weekday() if value==1: NewDate= dt + timedelta(days=1) elif value==2: NewDate = dt elif value==3: NewDate=dt+timedelta(days=6) elif value==4: NewDate=dt+timedelta(days=5) elif value==5: NewDate=dt+timedelta(days=4) elif value==6: NewDate=dt+timedelta(days=3) elif value==7: NewDate=dt+timedelta(days=2) else : pass if Pay=="Monthly": strvalue=dt.strftime('%Y/%m/%d') if strvalue[:2]=="15": strDate=str(dt.month)+"/16/"+str(dt.year) NewDate=parse(strDate) elif strvalue[:3]=="01": NewDate=dt else : strDate=str(dt.month+1)+"/01/"+str(dt.year) NewDate=parse(strDate) else : NewDateValue="1/1/1990" NewDate=parse(NewDateValue) mm=NewDate.month yyyy=NewDate.year print(yyyy) if len(str(mm))==1: mm="0"+str(mm) dd=NewDate.day if len(str(dd))==1: dd="0"+str(dd) _date=str(yyyy) +str(mm)+str(dd) return _date $$ LANGUAGE plpythonu; 的大小时,它显示8个字节。为什么??

4 个答案:

答案 0 :(得分:7)

您对宏的使用扩展为类似sizeof (sizeof ....)的内容。由于sizeof的结果是size_t,因此您获得sizeof (size_t),这在您的平台上显然是8。

你可能想要

printf("%zu\n", TOTAL_ELEMENTS);

(注意%dsize_t的错误转换说明符,一个好的编译器至少会警告你的版本。)

这是一个有效的完整程序:

#include <stdio.h>

int main()
{
    int array[] = {23,34,12,17,204,99,16};
    size_t const TOTAL_ELEMENTS = (sizeof array) / (sizeof array[0]);

    printf("%zu\n", TOTAL_ELEMENTS);
}

输出:

7

请注意,我将TOTAL_ELEMENTS设为普通对象,因为此处不需要将其作为宏。如果您想要一个替换数组名称的版本,您可能需要它作为宏,如下所示:

#define TOTAL_ELEMENTS(a) (sizeof (a) / sizeof (a)[0])

然后你写:

printf("%zu\n", TOTAL_ELEMENTS(array));

答案 1 :(得分:3)

当您使用#define时,预处理器会将TOTAL_ELEMENTS替换为(sizeof(array) / sizeof(array[0]))

(sizeof(array) / sizeof(array[0]))的结果类型是size_t。在sizeof上使用size_t运算符时,它将返回其大小。在你的情况下是8个字节。

答案 2 :(得分:2)

<select multiple class="commits2 form-control" size="9"> 根据6.5.3.4p5

返回$('option').mousedown(function(e) { e.preventDefault(); $(this).prop('selected', $(this).prop('selected') ? false : true); return false; }); 类型的尺寸

您平台的sizeofsize_t

答案 3 :(得分:0)

sizeof返回项目的大小,以字节为单位。由于很多类型都比单个字节大,所以如果你有一个数组,确定其大小元素的一种方法是获取数组的总大小(以字节为单位),然后将其除以它由 - 组成的元素类型的大小 - 并且该类型将位于数组的第一个元素中,索引为0。

例如,如果我有一个int的数组,并且int在我的平台上是4个字节,那么它在内存中会是这样的

Item 0 | Item 1 | Item 2
4bytes | 4bytes | 4bytes

sizeof(array)将是12,即数组的总大小(以字节为单位)。 sizeof(array)/sizeof(array[0])将为3,即数组中元素的总大小。

您在代码中使用宏错误。你应该使用:

printf("%zu", TOTAL_ELEMENTS);

否则代码会扩展为sizeof(sizeof ...),如果你实际上在数组中的元素长度之后,那么这不是你想要的。 sizeof(sizeof(something))会在您的平台上返回size_t类型的大小,这就是您看到8的原因。