簡體   English   中英

在printf中的gcc自動更正格式

[英]gcc auto correcting format in printf

我正在使用gcc(Ubuntu 4.8.4-2ubuntu1〜14.04.3)4.8.4並編譯以下代碼:

void main()
{
float f= 10.0;
char *str = "hello";
printf("f=%.1f str=%s\n",str, f);
}

編譯器顯示警告是預期的:

prac.c: In function 'main':
prac.c:8:1: warning: format '%f' expects argument of type 'double', but argument 2 has type 'char *' [-Wformat=]
 printf("f=%.1f str=%s\n",str, f);
 ^
prac.c:8:1: warning: format '%s' expects argument of type 'char *', but argument 3 has type 'double' [-Wformat=]

但是,在執行該程序時,將自動校正輸出。

# ./a.out
f=10.0 str=hello

這是怎么回事。 編譯器的哪個功能正在執行此操作。 任何禁用此自動校正的方法。

那不是“自動校正”,而是“未定義的行為”。 之所以會發生這種情況,是因為浮點變量可能(或可能不會!)傳遞給與整數類型分開的單獨空間中的函數。 因此,當您傳遞一個指針(或int)和一個雙精度值時,即使您以錯誤的順序指定了它們,它們仍在使用每種類型的第一個插槽。

使用-Wformat=2-Werror編譯,您將再也看不到此問題,因為GCC(和Clang)將拒絕生成此類代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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