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

0 c

int array[] = {23,34,12,17,204,99,16};
#define TOTAL_ELEMENTS (sizeof(array) / sizeof(array[0]))
printf("%d",sizeof(TOTAL_ELEMENTS));
Run Code Online (Sandbox Code Playgroud)

这是我的一些示例代码.数组是整数类型.所以,这array[0]也是一个整数.整数除以整数应该产生一个整数.但是,当我尝试TOTAL_ELEMENTS使用sizeof()运算符查找大小时,它显示8个字节.为什么??

Tob*_*ght 7

您对宏的使用扩展到类似的东西sizeof (sizeof ....).由于结果sizeof是a size_t,你得到的sizeof (size_t),在你的平台上显然是8.

你可能想要

printf("%zu\n", TOTAL_ELEMENTS);
Run Code Online (Sandbox Code Playgroud)

(注意,这%d是一个错误的转换说明符size_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);
}
Run Code Online (Sandbox Code Playgroud)

输出:

7
Run Code Online (Sandbox Code Playgroud)

请注意,我TOTAL_ELEMENTS是一个普通的对象,因为这里不需要它是一个宏.如果您想要一个替换数组名称的版本,您可能需要它作为宏,如下所示:

#define TOTAL_ELEMENTS(a) (sizeof (a) / sizeof (a)[0])
Run Code Online (Sandbox Code Playgroud)

然后你写:

printf("%zu\n", TOTAL_ELEMENTS(array));
Run Code Online (Sandbox Code Playgroud)