首页 > 解决方案 > 当我有一个可以同时采用可变和不可变 char* 的函数时,如何避免出现警告

问题描述

我有一个接受 achar*作为参数的 C 函数,在某些情况下我将 a 传递const char*给函数。在内部,该函数在使用它之前复制字符串,因此它可以接受可变字符串或不可变字符串。

不幸的是,这会产生一个警告,因为在某些情况下我将 const 传递给函数。目前,我通过将输入转换为普通的char*. 这是正确的做法吗?

标签: ctypes

解决方案


如果一个函数既可以接受可变字符串也可以接受不可变字符串,因为它实际上从未修改过字符串,则应将其声明为 accept const char *。这不应该引起任何警告,也没有必要强制转换参数。

将参数声明为指向 const 的指针表示承诺不修改数据。如果函数定义确实尝试通过指针进行分配,或者将其传递给未声明该参数的函数,您将在函数定义中遇到错误const。但是调用者不受参数常量的限制——将可变数据传递给实际上不会改变它的函数是没有问题的。

例如,请参见 的声明strcpy()

char * strcpy ( char * destination, const char * source );

source参数已声明,const char *但您可以复制可变字符串。但是您当然不能将不可变字符串作为destination参数传递(您必须将其强制转换为非常量指针才能让编译器接受它,但如果您实际上传递不可变字符串,则会导致未定义的行为)。


推荐阅读