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


我的主要功能如下:

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

这警告意味着什么?


12705
2018-03-13 23:36


起源

你这么说 huffenc 需要一个 char *,但你传递了它 char const *... - Oliver Charlesworth
只需定义main而不用 const。 - teppic
嗯,你可以,但这是不优雅的(并有潜在的危险)。一个更好的解决方案是弄明白 为什么  huffenc 需要一个非const指针,并在可能的情况下将其更改为const。 - Oliver Charlesworth
这是一个错误的定义 main 无论如何,只是从正确开始; int main(int argc, char *argv[])。 - Ed S.
@Kay:嗯,标准很清楚,main的定义也是 int main(int argc, char *argv[]) 要么 int main(void)。它接着说 “5.1.2.2.1程序启动:参数argc和argv以及argv数组指向的字符串 应由程序修改......” 所以我 将 称之为不正确。它当然会起作用,但为什么呢?当两个标准定义中的任何一个导致错误的程序? - Ed S.


答案:


这意味着你正在通过 const 对非函数的参数const 论证,由于显而易见的原因,这可能是坏事。

huffenc 可能不需要非const 论证,所以它应该采取 const char*。但是,你的定义 main 是非标准的。

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

程序启动时调用的函数名为main。实施宣布否   这个功能的原型。它应该定义为返回类型int和no   参数:

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

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

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

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

继续说......

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


16
2018-03-13 23:50