#include <stdlib.h>
#include <stdio.h>
#define SIZE_TYPE
#define MEM_SIZE_BYTES 4096
#define MEM_SIZE_WORDS MEM_SIZE_BYTES/sizeof(int)
int main() {
printf("bytes are %d\n", MEM_SIZE_BYTES);
printf("words are %d\n", MEM_SIZE_WORDS);
}
编译会发出警告......为什么?
testintsize.c:11:5: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘long unsigned int’ [-Wformat]
我在这里找到了SIZE_TYPE宏:https://gcc.gnu.org/onlinedocs/gccint/Type-Layout.html 这与此有关。
这样做不会导致警告消失:
#define SIZE_TYPE int
答案 0 :(得分:2)
您有几种不同的方法来解决此警告:
选项#1:
#define MEM_SIZE_WORDS MEM_SIZE_BYTES/sizeof(int) // change this
#define MEM_SIZE_WORDS MEM_SIZE_BYTES/(int)sizeof(int) // to this
选项#2:
#define MEM_SIZE_WORDS MEM_SIZE_BYTES/sizeof(int) // change this
#define MEM_SIZE_WORDS (int)(MEM_SIZE_BYTES/sizeof(int)) // to this
选项#3:
printf("words are %d\n", MEM_SIZE_WORDS); // change this
printf("words are %lu\n", MEM_SIZE_WORDS); // to this
答案 1 :(得分:2)
在这种情况下,sizeof返回一个long unsigned int。解决警告的一种方法是:
#include <stdlib.h>
#include <stdio.h>
#define SIZE_TYPE
#define MEM_SIZE_BYTES 4096
int intSize = sizeof(int);
#define MEM_SIZE_WORDS MEM_SIZE_BYTES/intSize
int main() {
printf("bytes are %d\n", MEM_SIZE_BYTES);
printf("words are %d\n", MEM_SIZE_WORDS);
}
intSize是全局变量。在某些情况下,它不会被视为最佳做法。使用强制转换为int将是优越的(请参阅barak的评论和回答)。
答案 2 :(得分:1)
sizeof
运算符返回类型size_t
,它是无符号整数类型。通过C的隐式类型转换规则MEM_SIZE_BYTES/sizeof(int)
也具有相同的类型size_t
。
要打印该类型的值,请使用%zu
作为printf
格式。