[问题] 出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