[英]compiler warnings mixing long long int and int in printf
我一直在研究包含以下性質的代碼的程序。
printf("%lld",somelonglongint)
但是我正在一個sparc平台上工作,即使在64位版本上,long long是64位,int和long int是32位。 如果錯誤地將一行代碼讀入
printf("%d",somelonglongint)
即使使用-Wall也沒有編譯器警告,什么也沒有,但是此代碼將導致程序打印無意義,或者經常導致程序出現段錯誤。 有什么方法可以強制gcc至少對此發出警告,最好是錯誤,因為結果是災難性的
當未定義的行為起作用時,就會發生這種情況。 使用錯誤的說明符調用UB。
如果轉換規范無效,則行為是undefined 。 282)如果任何參數不是對應轉換規范的正確類型,則行為未定義。
用標志-Wall
和GCC編譯它給我警告
[Warning] format '%d' expects argument of type 'int', but argument 2 has type 'long long int' [-Wformat=]
在Ubuntu 14.04上編譯時不帶-Wall
:
haccks@haccksbuntu:~/Desktop$ gcc test.c
test.c: In function ‘main’:
test.c:66:2: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘long long int’ [-Wformat=]
printf("%d\n", somelonglongint);
^
來自man gcc
:
-Wformat
檢查對“ printf”和“ scanf”等的調用,以確保提供的參數具有適合於指定格式字符串的類型,並且確保在格式字符串中指定的轉換有意義。 這包括“ printf”,“ scanf”,“ strftime”和“ strfmon”(X / Open擴展,不是C標准)中的標准函數以及由格式屬性指定的其他函數(或其他特定於目標的族) )。 在未指定格式屬性的情況下檢查哪些功能取決於所選的標准版本,並且未指定屬性的功能的此類檢查將由-ffreestanding或-fno-builtin禁用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.