2

我尝试通过强制转换为 unsigned long 来打印 size_t (如“C 编程现代方法”一书中所建议的那样),如下所示:

printf("size:%lu, bsize:%lu", (unsigned long)size, (unsigned long)bsize);
printf("size:%lu, bsize:%lu", ((unsigned long)size), ((unsigned long)bsize));

第一行会给我警告(gcc):

warning: format '%lu' expects argument of type 'long unsigned int', but argument 2 has type 'size_t' [-Wformat]

第一行和第二行有什么区别?我所做的只是添加额外的括号,这到底是做什么的?

我知道我可以使用“%z”,但这个问题困扰着我。

4

1 回答 1

2

假设周围没有丑陋#define的s

printf("size:%lu, bsize:%lu", (unsigned long)size, (unsigned long)bsize);

printf("size:%lu, bsize:%lu", ((unsigned long)size), ((unsigned long)bsize));

是等价的。

因此它们将导致相同的代码/警告/错误。

如果他们不这样做,那就是有什么东西坏了。

于 2013-06-16T11:38:46.453 回答