传递参数 1 会丢弃来自指针目标类型的限定符

Posted

技术标签:

【中文标题】传递参数 1 会丢弃来自指针目标类型的限定符【英文标题】:Passing Argument 1 discards qualifiers from pointer target type 【发布时间】:2013-03-02 04:06:06 【问题描述】:

我的主要功能如下:

int main(int argc, char const *argv[])

    huffenc(argv[1]);
    return 0;

编译器返回警告:

huffenc.c:76: warning: passing argument 1 of ‘huffenc’ discards qualifiers from pointer target type

作为参考,huffenc 接受char* 输入,并执行函数,样本输入“无意义”通过./huffenc senselessness

这个警告意味着什么?

【问题讨论】:

你说huffenc 需要char *,但你传递给它的是char const *... 只定义没有const的main。 你可以,但那很不雅(而且有潜在危险)。更好的解决方案是弄清楚 为什么 huffenc 需要一个非常量指针,并尽可能将其更改为 const。 无论如何,这对main 的定义是不正确的,只要从一开始就做对; int main(int argc, char *argv[]). @Kay:嗯,标准很清楚,main 的定义是int main(int argc, char *argv[])int main(void)。它接着说“5.1.2.2.1 程序启动:参数argc和argv以及argv数组指向的字符串应由程序修改...” 所以,我称它不正确。它当然会起作用,但为什么呢?这两个标准定义中的任何一个何时导致程序出现错误? 【参考方案1】:

这意味着您将const 参数传递给一个接受非const 参数的函数,由于显而易见的原因,这可能是不好的。

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

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

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

int main(void)  /* ... */ 

或带有两个参数(此处称为 argc 和 argv,尽管任何名称都可以 使用,因为它们在声明它们的函数中是本地的):

int main(int argc, char *argv[])  /* ... */ 

或等效的;9) 或以其他实现定义的方式。

接着说……

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

【讨论】:

以上是关于传递参数 1 会丢弃来自指针目标类型的限定符的主要内容,如果未能解决你的问题,请参考以下文章

初始化丢弃来自指针目标类型的限定符

将 'const QVariant' 作为 'this' 参数传递会丢弃限定符 [-fpermissive]

错误:将 xxx 作为 xxx 的“this”参数传递会丢弃限定符

错误:将“const SunscreenSPF”作为“this”参数传递会丢弃限定符问题

C++ 错误 - 将 'const Dataset<double>' 作为 'this' 参数传递会丢弃限定符 [-fpermissive]

C++ Boost - 序列化错误 - 将“const B”作为“this”参数传递会丢弃限定符