[問題] 出warning之後compiler的運作方式

作者: k03004748549 (蜆)   2014-11-24 15:13:59
開發平台(Platform): (Ex: VC++, GCC, Linux, ...)
GCC (Ubuntu 4.8.2-19ubuntu1)
額外使用到的函數庫(Library Used): (Ex: OpenGL, ...)
只有 -lm
問題(Question):
大家好...我最近才剛接觸C
這邊問的感覺應該是小問題,不過google都查不到...
還請各位鞭小力點
最近在看一段code,其年代久遠(約1990)
可能是規範與現今有差異,或是當時平台不同(好像最早是在sparc上run的)
code裏面常有一些疏漏
例如:
1. 令一變數int p,用以儲存從外部讀入的某個參數
之後為了要檢查是否有順利讀入,而使用了判斷式
if ( p == NULL )
來檢查p是否仍在最初狀態而尚未儲存過資料
不過因為NULL約等於(void *)0
這樣做意味著對int與pointer做比較,而會出現
warning: comparison between pointer and integer [enabled by default]
奇怪的是如果我不理他的話,這個功能是不會出錯的
想問再出現[enabled by default]之後到底編譯器做了什麼事?
而且我不知道該如何修正...
NULL改成0的話,要是讀入值真的是0就有問題了
或是我自己將初始直改成某個不可能會是讀入資料的數值呢?(例如負數)
2. 使用了malloc、exit、strlen卻沒有 #include <stdlib.h>
同樣的有warning出現
warning: incompatible implicit declaration of built-in
function ‘strlen’ [enabled by default]
這邊我也是很好奇不去include到底compiler會做什麼事
因為程式仍然可以執行,而且某些程式(很少,大約一兩個)
在我 #include <stdlib.h>之後
反而會出現 segmentation fault,讓我感到很疑惑
還煩請各位指點迷津,謝謝
作者: azureblaze (AzureBlaze)   2014-11-24 17:12:00
跑得了法律門(語言規範),躲不過道德門(良好習慣)所以能夠正常跑,但是開個警告給你看你要不要改enable by default就是這種狀況gcc預設會警告你你也可以叫他閉嘴別雞婆,不建議就是了另外整數設為NULL就只是個0而已,不代表沒資料只有NULL pointer才代表沒東西
作者: dirkc (3781615)   2014-11-24 18:21:00
NULL通常是個macro;例如#define NULL ((void*)0)或(0L)據說比較舊的編譯器會#define NULL成一些別的值所以"...改成某個不可能會是讀入資料的數值"是較建議的作法seg. fault應該有別的原因,要看code
作者: ZanFu5566 (仁甫56 優質56 清新56)   2014-11-25 01:22:00
gdb 看看吧
作者: Killercat (殺人貓™)   2014-11-25 18:53:00
其實C++11以後別再NULL了 用nullptr吧....

Links booklink

Contact Us: admin [ a t ] ucptt.com