2014-10-19 60 views
1
#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 
+2

'sizeof'運算符返回一個'size_t'類型的值,它必須是無符號的,並且足夠大以適應平臺上所有可能的大小,並且在您的特定平臺上是'unsigned long int',您需要'「%lu」'格式。參見例如[這個'printf'參考頁面](http://en.cppreference.com/w/c/io/fprintf)。 – 2014-10-19 05:25:40

+0

SIZE_TYPE宏有什麼作用? – abc 2014-10-19 05:34:36

+0

編譯器可能會檢查它是否有'size_t'的定義。定義它可能會導致奇怪的事情發生。 – 2014-10-19 05:38:27

回答

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 
+0

-1,這不是問題的答案,而且還提供了錯誤的解決方案。 – 2014-10-19 15:57:51

+0

@JensGustedt:閱讀這個問題,你是挑剔的。 OP瞭解這個問題,並且正在尋找解決方案。 – 2014-10-19 16:08:46

+0

C標準預見的真正解決方案是使用'%zu'作爲格式說明符。 – 2014-10-19 16:12:17

2

在這種情況下,的sizeof返回一個長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的評論和答案)。

+1

每次使用'MEM_SIZE_WORDS'時,這將產生一個運行時計算。 – 2014-10-19 05:36:14

+0

什麼是#define SIZE_TYPE宏在這裏做什麼? – abc 2014-10-19 05:37:09

+0

嗨@barak,自從我寫上我最後的C代碼以來,這已經過去了。在預編譯器編譯之前,MEM_SIZE_BYTES/intSize會被計算一次嗎?此時,MEM_SIZE_WORDS將被結果值簡單地替換。也就是說,在運行時不需要重新計算。 – 2014-10-19 05:46:04

0

sizeof運算符返回類型size_t這是一個無符號整數類型。由C的隱式類型轉換規則MEM_SIZE_BYTES/sizeof(int)也具有相同的類型,size_t

要打印該類型的值,請使用%zu作爲printf格式。

相關問題