gpt4 book ai didi

c - 定义常量的数据类型是什么?

转载 作者:太空狗 更新时间:2023-10-29 17:10:07 24 4
gpt4 key购买 nike

我正在尝试这段代码。

#include <stdio.h>
#include <stdlib.h>
#define LOWER 0
#define UPPER 300

int main()
{
printf("%d %f",LOWER,UPPER);
return 0;
}

我读了一些答案,上面说定义的常量没有类型,也没有分配任何内存。那么,如果我在 printf() 中指定不同的类型说明符,为什么会报错?

最佳答案

在您的示例中,两者都作为 int 值被推送到 printf 的可变参数列表中。这可能导致 printf() 格式字符串中的格式标志与基础类型不匹配的问题。引用this post为什么会发生未定义的行为。

尽管看起来很可怕,但要知道您可以在此 printf 中获得所需内容的一种方法是执行以下操作:

#include <stdio.h>
#include <stdlib.h>
#define LOWER 0
#define UPPER 300

int main()
{
printf("%d %f", (int)LOWER, (float)UPPER);
return 0;
}

在这两种情况下,这些都是在 编译之前被替换的预处理器宏。请注意,如果 UPPER 无法提升为 float,您将收到编译器错误,这是一件好事。如果可以,它就会,并且 printf() 将找到它需要的字节来打印它想要的内容。 int 和 LOWER 也是如此。上面的 printf 经过预处理后会退化成这样:

printf("%d %f", (int)0, (float)300);

现在假设您的宏是这样声明的:

#define LOWER 100.0
#define UPPER 300.0

原始的printf()经过预处理后会这样呈现:

printf("%d %f", 100.0, 300.0);

这似乎是正确的,但是 100.0 float 真的会被 printf() 中的 %d 格式字符串处理程序正确删除吗?确保。做我们之前做的:

printf("%d %f", (int)LOWER, (float)UPPER);

现在预处理为:

printf("%d %f", (int)100.0, (float)300.0);

您可能会在 float-to-int 转换时收到编译器警告,也可能不会。除非您想掷骰子确定您传递的内容大小为 printf() 之类的预期字节大小,否则您需要非常确定所有内容都匹配。当格式说明符期望一件事时,这会变得特别令人沮丧,传递了一些不同的东西,但它似乎一切正常,但只是在某些平台上神秘地:

printf("%ld\n", UPPER);

这可能“有效”,但如果有效,那只是因为一个 long int 和一个 int 在您的平台上大小相同。将此代码移动到 long intint 具有不同位宽及其 UB 的平台。

底线:如果您将预处理器宏传递到诸如 printf() 之类的可变参数列表中,这些参数对被推送的数据有大小期望(例如,由格式字符串指定),您最好确保您推送的内容符合预期。

关于c - 定义常量的数据类型是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13162528/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com