簡體   English   中英

編譯器警告在printf中混合了long long int和int

[英]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。

C11:7.2.1.6.1:

如果轉換規范無效,則行為是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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM