我不确定 LEN(LONG_MAX) 是如何打印 19 的,它应该只是 8。
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#define STRING(x) #x
#define LEN(x) ((int)sizeof(STRING(x)) - (int)1)
int main()
{
printf("%d\n",LEN(LONG_MAX));
return 0;
}
在您使用的系统中
sizeof( long )
似乎等于8
.
在这种情况下,
LONG_MAX
的值为9223372036854775807
。那就是数字包含19
数字。
由于这个宏
#define STRING(x) #x
值被转换为字符串文字
"9223372036854775807"
.
字符串文字存储为字符数组,尾随终止零字符
'\0'
。所以 sizeof( "9223372036854775807" )
等于 20
(19
加一作为字符串文字的终止零字符 '\0'
)。
因此这个宏产生的整个表达式
#define LEN(x) ((int)sizeof(STRING(x)) - (int)1)
等于
19
.
注意,通常这种方法可能不起作用,因为 LONG_MAX 或 ULONG_MAX 等名称的定义是实现定义的。例如,一个无符号整数常量可以有一个后缀,例如 ul.
更可靠的方法是使用标准 C 函数
snprintf
代替宏。例如
int n = snprintf( NULL, 0, "%llu", ULLONG_MAX );
printf( "n = %d\n", n );