我尝试通过强制转换为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”,但这个问题让我感到困扰。
答案 0 :(得分:2)
假设周围没有丑陋的#define
printf("size:%lu, bsize:%lu", (unsigned long)size, (unsigned long)bsize);
和
printf("size:%lu, bsize:%lu", ((unsigned long)size), ((unsigned long)bsize));
是等价的。
因此它们将导致相同的代码/警告/错误。
如果他们不这样做,那就会有一些损失。