如何消除将多维数组作为const多维数组传递的警告?

给出以下代码:

/* signatures */ int getParams(char params[MAX_PARAM_LEN][MAX_LINE_LEN]); int getVersion(const char params[MAX_PARAM_LEN][MAX_LINE_LEN], const char* tagName ); /* initializing */ char params[MAX_PARAM_LEN][MAX_LINE_LEN] = {}; /* getting parameters */ paramCount = getParams(params); /* OK, params match with getParams signature */ /* processing the params array */ i = getVersion(params, "version"); /* warning: passing arg 1 of `getVersion' from incompatible pointer type */ 

我看到constness是问题,但我不知道为什么或如何避免它。 我想要的是一个不能再修改params的函数。 欢迎任何建议(除了禁用此警告或删除处理函数中的const)。

谢谢:Visko

如果没有对正确的类型进行显式强制转换,则无法在C中消除这些警告。 没有typedef,这看起来会很难看

 i = getVersion((const char (*)[MAX_LINE_LEN]) params, "version") 

这是一个特定于C语言的奇怪怪癖。 在C ++中,此问题已得到修复。

顺便说一句, {}初始化程序在C中是非法的。你是如何设法编译的?

这个问题没有很好的解决方案 – 我通常只是在函数参数上注释掉const限定符,以表明理想情况下它应该是const但我们也想在没有警告的情况下编译,即

 int getVersion(/* const */ char params[MAX_PARAM_LEN][MAX_LINE_LEN], const char* tagName ); 
 foo((char const (*)[MAX_LINE_LEN] params); 

有效,但不是很实用,可能很危险(它接受任何指针)。

一种更强大的方式是:

 foo((char const(*)[MAX_LINE_LEN])(char const*const){ &params[0][0] }); 

您可以使用宏P99_ACALL自动执行此“投射”,有关详细信息,请参阅http://gustedt.wordpress.com/2011/02/12/const-and-arrays/ 。