2016-06-01 36 views
1

代碼:注:應爲 '字符* __restrict__',但說法是 '中int8_t *' 類型的

int8_t ret; 
int8_t buf[8]; 
bytes_written = snprintf(buf, 8, "%" PRId8, 2); 

警告:

warning: pointer targets in passing argument 1 of ‘snprintf’ differ in signedness [-Wpointer-sign] 
    bytes_written = snprintf(buf, 8, "%" PRId8, 2); 
    ^
/usr/include/stdio.h:386:12: note: expected ‘char * __restrict__’ but argument is of type ‘int8_t *’ 
extern int snprintf (char *__restrict __s, size_t __maxlen, 

我知道這可以通過採取buf絕對爲*字符被固定但

是中int8_t的typedef unsigned char型

檢查預處理器輸出,即gcc main.c | grep int8_t

那麼爲什麼編譯器無法理解呢?

使用buf as uint8_t我也得到相同的警告。

編輯:

中int8_t是類型定義爲有符號字符(搞錯了我在原來的職位寫成無符號)

+0

什麼是PRId8。如果對'snprintf'的調用不是'bytes_written = snprintf(buf,8,「%PRId8」,2);'? – Nishant

+0

看看這個http://stackoverflow.com/questions/17744226/int8-t-vs-char-which-is-the-best-one – piyushj

+3

@Nishant不,PRId8是一個CPP宏。 – a3f

回答

4

sprintf家人通話的需要char *緩衝區中寫入自己數據。

您目前它作爲int8_t *(一簽署 8位值),而事實上,它的抱怨類型的符號性幾乎肯定意味着肉眼char您的系統上未簽名(標準離開它開放以確定char是否是帶符號或無符號類型)或者gcc足夠聰明,可以認識到這可能是其他編譯器的可移植性問題。

請注意這是一個警告所以它可能仍然有效。不過,我喜歡清理這樣的代碼,以便讓我的生活更輕鬆。

當然,修正是使用正確的類型(通過將類型更改爲char buf[8]或明確將其轉換爲snprintf調用,從而告訴編譯器您知道您在做什麼)。

+0

'char'與'signed char'和'unsigned char'是不同的類型,無論。 – o11c

+0

@paxdiablo它也給uint8_t發送了與* buf *相同的警告。我使用gcc編譯代碼,默認情況下將char視爲signed char – Patrick

相關問題