C标准中可变参数列表内const合规使用与访问的检查规定咨询
C标准中可变参数列表内const合规使用与访问的检查规定咨询
嘿,我来给你捋捋这个问题哈~
目前不管是C99、C11还是最新的C17、C23标准里,都没有专门针对可变参数列表中const的合规使用与访问的明确检查规定。
你看你写的这段代码:
int func (char *pBuffer, int nLen, ...) { va_list ArgList; va_start(ArgList, nLen); char *pName = va_arg(ArgList, char*); // do things with the string such as copy it to an output buffer. strcpy (pBuffer, pName); }
这里用va_arg取出char*类型的参数,但如果实际传入的是一个const char*类型的字符串,你用char*去接收,这种类型不匹配的问题,C标准压根没要求编译器必须检测出来——很多时候编译器甚至不会给你任何警告,完全得靠咱们自己把控类型的一致性。
可变参数的机制本身就比较“松散”,va_start、va_arg这些宏都是让开发者手动指定类型,C标准把类型匹配的责任完全交给了写代码的人。至于const的合规性,比如有没有非法把const指针转成非const去修改数据这类问题,标准里也没有任何条款要求对可变参数里的const做专门检查。
简单说就是,C标准在这一块是“放养”状态,没有强制的检查规则,全靠咱们自己写代码时留意const修饰符的使用,别搞混指针的常量属性就行。
内容来源于stack exchange
相关产品推荐
相关产品推荐

