首页 > 代码库 > 对于新手,某些可变参数函数在使用时,可能会出现的问题

对于新手,某些可变参数函数在使用时,可能会出现的问题

在学习进程操作测试linux exec函数时,写了非常简单的一段测试代码,如下:技术分享

在用gcc version 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5) 编译时,提示一下问题:
技术分享

后来,与一本参考书进行比对,也没有发现错误(可能GCC版本不一样),后来查找了一下其它资料,发现问题:对于一些参数为变长数组的函数,必须在参数末尾加上 NULL 值,来表明传递的参数结束.例如这里的execl格式(exec的一种形式,其总共有六种表达形式).

   对于有可变参数数组的函数,可能出现的一些问题阐述一下.以execl形式为例.

这个函数:execl(const char * path, const char * arg0, .../* (char*)0 */);

在用GCC进行编译时,可能会出现以下两种问题:
1   warning: not enough variable arguments to fit a sentinel(参数个数不足);

     解决方法:补齐参数即可.对于上面的execl函数,至少需要两个参数.(path 可执行文件的文件名,即完整 路径;arg 作为约定,与path一样指出目标文件的路径);

2   warning: missing sentinel in function call;

      解决方法:在形参列表中,添加一个NULL 或者采用(char*)0也可以,给编译器(complier)一些提示:"告诉编译器,不要往下找了,没有参数需要传递了".

         如execl("/bin/date","/bin/date",(char*)0)与execl("/bin/date","/bin/date",NULL);


技术分享

此外,对于0与(char*)0 ,在64位的操作系统中,整数0是32位,而指针0是64位的,但是,编译器(complier)并不能知道,所以才会出现问题.

本文出自 “在痛苦中慢慢前行” 博客,请务必保留此出处http://jjyynice.blog.51cto.com/10193818/1858709

对于新手,某些可变参数函数在使用时,可能会出现的问题