传递参数 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]