我現在將一些32位C代碼移植到64位平臺。
對於下面的代碼,我認爲在我添加選項"-Wall -Wconversion -Wextra"
將代碼編譯爲64位平臺(x86_64而不是IA64)時,應由GCC發出警告。
但是,我沒有得到任何警告...
int len = strlen(pstr);
奇怪的是,當我的代碼更改爲以下,我可以得到約「的size_t」和「INT」
size_t sz = strlen(pstr);
int len = sz;
之間的轉換wanrings
環境信息:
gcc版本4.4.7
的Linux dev217 2.6.32-358.el6.x86_64#1 SMP週五02月22日0點31分26秒UTC 2013 x86_64的x86_64的x86_64的GNU /李nux
任何想法爲什麼?
編輯: 我可以通過一個非常簡單的程序來驗證這一點。
[jsun @/TMP]
[jsun @/TMP]貓test1.c
#include <stdio.h>
#include <string.h>
#include <unistd.h>
int main()
{
int len = strlen("testllllll");
printf("len is %d\n", len);
return 0;
}
[jsun @/TMP] GCC -Wall -Wconversion -Wextra test1.c
[jsun @/TMP]
修改代碼一點後:
[jsun @/TMP]
[jsun @/TMP]貓test1.c
#include <stdio.h>
#include <string.h>
#include <unistd.h>
int main()
{
size_t sz = strlen("test111111");
int len = sz;;
printf("len is %d\n", len);
return 0;
}
[jsun @/TMP] GCC -Wall -Wconversion -Wextra test1.c
test1.c:在功能上€〜馬伊納€™:
test1.c:8:警告:轉化爲€~int’從€~size_t’可以改變其值
[jsun @/TMP]
所以你#include?如果你不這樣做,隱式函數聲明將返回int。你可以發佈你的源文件和gcc輸出嗎? –
tristan
我在原帖中粘貼了代碼 – Jacky
我目前沒有編譯器來測試這個,但是你可以嘗試改變它來調用從main(int argc,char * argv)傳入的參數上的strlen() []),看它是否產生警告(例如'strlen(argv [1])')。編譯器可以將strlen(conststring)優化爲精確值(在你的例子中爲10),甚至不包括對strlen的調用。在這種情況下,它可能不會導致警告。 –