2017-04-08 79 views
1

如果我嘗試編譯GCC抱怨%魯%都ü

printf("here %u\n", dest->q_head); 

GCC與

error: format ‘%u’ expects argument of type ‘unsigned int’, but argument 2 has type ‘ngx_uint_t {aka long unsigned int}’ 

不夠公平抱怨..

但是,如果我編譯

printf("here %lu\n", dest->q_head); 

我得到

error: format ‘%lu’ expects argument of type ‘long unsigned int’, but argument 2 has type ‘ngx_uint_t {aka unsigned int}’ 

代碼中沒有其他變化。

ngx_uint_t被定義爲...

typedef unsigned int ngx_uint_t; 

dest->頭被定義爲...

ngx_uint_t     q_head; 

如果我將它轉換爲(無符號整數)彙編並打印確定。

printf("here %u \n", (unsigned int)dest->q_head); 

任何想法發生了什麼?

+0

[無法重現](http://coliru.stacked-crooked.com/a/da1544e7ecaa4231) - [mcve]需要。 –

回答

0

執行printf()不知道術語ngx_uint_ttypedef不會改變這一點。所以printf()根本不知道什麼是從線怎麼回事,並引發錯誤

http://code.metager.de/source/xref/gnu/glibc/stdio-common/vfprintf.c 270個向下

http://code.metager.de/source/xref/gnu/glibc/stdio-common/printf.cprintf()電話vfprintf()

這也是爲什麼鑄造,當它工作的原因

+0

我不遵循:我試着閱讀代碼。 我認爲問題是用GCC驗證格式字符串,不是嗎?我錯誤是編譯而不是運行代碼。錯誤消息意味着GCC對ngx_uint_t的報告有一些看法,儘管它不正確。 printf是作爲庫還是某種模板/宏實現的? – teknopaul

+0

如果你想要正確使用'gdb',printf是在'libc'中。 –

+0

GCC錯誤是編譯問題,你不能在沒有編譯的代碼上使用gdb – teknopaul