c - 当我有一个可以同时采用可变和不可变 char* 的函数时,如何避免出现警告
问题描述
我有一个接受 achar*
作为参数的 C 函数,在某些情况下我将 a 传递const char*
给函数。在内部,该函数在使用它之前复制字符串,因此它可以接受可变字符串或不可变字符串。
不幸的是,这会产生一个警告,因为在某些情况下我将 const 传递给函数。目前,我通过将输入转换为普通的char*
. 这是正确的做法吗?
解决方案
如果一个函数既可以接受可变字符串也可以接受不可变字符串,因为它实际上从未修改过字符串,则应将其声明为 accept const char *
。这不应该引起任何警告,也没有必要强制转换参数。
将参数声明为指向 const 的指针表示承诺不修改数据。如果函数定义确实尝试通过指针进行分配,或者将其传递给未声明该参数的函数,您将在函数定义中遇到错误const
。但是调用者不受参数常量的限制——将可变数据传递给实际上不会改变它的函数是没有问题的。
例如,请参见 的声明strcpy()
:
char * strcpy ( char * destination, const char * source );
source
参数已声明,const char *
但您可以复制可变字符串。但是您当然不能将不可变字符串作为destination
参数传递(您必须将其强制转换为非常量指针才能让编译器接受它,但如果您实际上传递不可变字符串,则会导致未定义的行为)。
推荐阅读
- reactjs - 在 React 中使用 useState 计算日期的示例
- python - 如何将日期值映射到 Python 中的时间戳范围?
- avi - SubRip、AVISubDetector、AviSynth 中的 RGB24 错误
- angular - 错误 TS2740:类型“可观察”
' 缺少类型 'ProjectPage[]' 的以下属性:length、pop、push、concat 和另外 25 个 - sql - Postgresql 更新非标签视图列
- php - 根据 PHP 中的项目哈希从会话中删除项目
- javascript - Big-O for while 循环没有预定义的迭代次数
- javascript - 用于包含 Express 数据库条目的按钮
- vim - 地图
在 vim 中表现不同 - postgresql - 使用 psql 从 csv 文件复制时,空列的 "" 会生成错误而不是 null