我经常在C++中使用execv()函数,但是如果某些参数是在C++字符串中.令我很生气的是我不能这样做:
const char *args[4]; args[0] = "/usr/bin/whatever"; args[1] = filename.c_str(); args[2] = someparameter.c_str(); args[3] = 0; execv(args[0], args);
这不会编译,因为execv()接受与const char*不兼容的char*const argv []所以我必须使用strdup()将我的std :: strings复制到字符数组,这很痛苦.
有谁知道这个的原因?
Open Group Base规范解释了为什么:为了与现有C代码兼容.但是,指针和字符串内容本身都不打算更改.因此,在这种情况下,你可以逃避 - const_cast
结果c_str()
.
引用:
包含有关
argv[]
和envp[]
成为常量的语句,以明确未来的语言绑定编写者,这些对象是完全不变的.由于ISO C标准的限制,不可能在标准C中陈述该想法.指定两个级别const
- 对exec函数argv[]
和envp[]
参数的限定似乎是自然的选择,因为这些函数不是修改指针数组或函数指向的字符,但这将禁止现有的正确代码.相反,只有指针数组被标记为常量.
之后的表格和文字更具洞察力.但是,Stack Overflow不允许插入表,因此上面的引用应该足以让您在链接文档中搜索正确的位置.