C 当我有一个可以同时接受可变字符和不可变字符的函数时,如何避免警告*

C 当我有一个可以同时接受可变字符和不可变字符的函数时,如何避免警告*,c,types,C,Types,我有一个C函数,它接受一个char*作为参数,在某些情况下,我将一个const char*传递给该函数。在内部,函数在使用字符串之前复制它,因此它可以接受可变字符串或不可变字符串 不幸的是,这会产生一个警告,因为在某些情况下,我会向函数传递一个常量。目前,我通过将输入转换为普通的char*来避免此警告。这是正确的做法吗?如果函数既可以接受可变字符串,也可以接受不可变字符串,因为它从来没有实际修改过字符串,那么应该声明它接受const char*。这不应该引起任何警告,也没有必要抛出论点 将参数声

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


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

如果函数既可以接受可变字符串,也可以接受不可变字符串,因为它从来没有实际修改过字符串,那么应该声明它接受
const char*
。这不应该引起任何警告,也没有必要抛出论点

将参数声明为指向const的指针表示不修改数据的承诺。如果函数定义确实试图通过指针赋值,或将其传递给未声明该参数的函数,则函数定义中会出现错误。但是调用者不受参数常量的限制——将可变数据传递给一个实际上不改变它的函数没有问题

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


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

如果函数可以同时接受可变字符串和不可变字符串,因为它实际上从未修改字符串,所以应该声明它接受
const char*
。这不应该引起任何警告,也没有必要抛出论点

将参数声明为指向const的指针表示不修改数据的承诺。如果函数定义确实试图通过指针赋值,或将其传递给未声明该参数的函数,则函数定义中会出现错误。但是调用者不受参数常量的限制——将可变数据传递给一个实际上不改变它的函数没有问题

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


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

如果您不对其进行变异,为什么不接受一个
const char*
作为参数呢?@UnholySheep,因为有时我会将一个普通的char*传递给一个非const的函数。它是一个你不能改变的函数吗?@tylerduden将
char*
传递给一个接受
const char*
的函数是可以的。如果你不改变它,为什么不接受一个
const char*
作为参数呢?@UnholySheep,因为有时候我会把一个普通的char*传递给一个非const的函数。它是一个你不能改变的函数吗?@tylerduden把
char*
传递给一个接受
const char*
的函数是可以的。你的意思是说:“但是你可以复制一个不可变的字符串”最后?不,我是说我写的。即使它被声明为
const char*
,你也可以复制
char*
。你的意思是在结尾说:“但是你可以复制一个不可变的字符串”吗?不,我是说我写的。即使声明了
const char*
,也可以复制
char*
char * strcpy ( char * destination, const char * source );