C 传递参数1将丢弃指针目标类型中的限定符

C 传递参数1将丢弃指针目标类型中的限定符,c,main,argv,C,Main,Argv,我的主要职能如下: int main(int argc, char const *argv[]) { huffenc(argv[1]); return 0; } 编译器返回警告: huffenc.c:76:警告:传递'huffenc'的参数1将丢弃指针目标类型中的限定符 作为参考,huffenc接受一个char*输入,并通过/huffenc senseless执行该函数,示例输入为“senselessness” 此警告意味着什么?它意味着您正在将一个常量参数传递给一个函数,该函

我的主要职能如下:

int main(int argc, char const *argv[])
{
    huffenc(argv[1]);
    return 0;
}
编译器返回警告:

huffenc.c:76:警告:传递'huffenc'的参数1将丢弃指针目标类型中的限定符

作为参考,
huffenc
接受一个
char*
输入,并通过
/huffenc senseless
执行该函数,示例输入为“senselessness”


此警告意味着什么?

它意味着您正在将一个
常量
参数传递给一个函数,该函数使用了一个非
常量
参数,由于明显的原因,该参数可能不好

huffenc
可能不需要非
const
参数,因此它应该采用
const char*
。但是,您对
main
的定义是非标准的

C99标准第5.1.2.2.1节(程序启动)规定:

程序启动时调用的函数名为main。实现声明没有 此功能的原型。它应定义为返回类型int,且无 参数:

或者使用两个参数(此处称为argc和argv,但可以使用任何名称) 使用,因为它们是声明它们的函数的本地函数):

或同等品;9) 或者以其他实施方式定义

接着说

…参数argc和argv以及argv数组指向的字符串应 可由程序修改,并在程序之间保留其最后存储的值 启动和程序终止


你说
huffenc
接受一个
char*
,但是你给它传递了一个
char const*
…只需定义main而不使用
const
。你可以,但这是不雅的(而且可能是危险的)。一个更好的解决方案是找出为什么
huffenc
需要一个非常量指针,如果可能的话,将其更改为常量。这是
main
的一个不正确的定义。不管怎样,只要从一开始就做好
intmain(intargc,char*argv[])
@Kay:好吧,标准很明确,main的定义要么是
intmain(intargc,char*argv[])
要么是
intmain(void)
。它接着说,“5.1.2.2.1程序启动:参数argc和argv以及argv数组指向的字符串应可由程序修改…”因此,我认为它不正确。这当然会奏效,但为什么呢?这两个标准定义中的任何一个何时导致了错误程序?
int main(void) { /* ... */ }
int main(int argc, char *argv[]) { /* ... */ }