为什么这段代码会发出警告?

时间:2014-10-19 05:23:21

标签: c

#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 

3 个答案:

答案 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格式。