6

我正在尝试将参数传递给函数,并指示const接收函数应考虑该参数。

我的理解是,以下代码示例显示了确保test可以使用argv未声明为 const 的变量调用函数的唯一方法。

void test(const char * const *arr);

int main(int argc, char *argv[], char *env[])
{
    test(argv);
}

void test(const char * const *arr)
{
}

但是,gcc 给了我一个警告,如下所示:

E:\Projects\test>gcc -o test test.c
test.c: In function 'main':
test.c:5:2: warning: passing argument 1 of 'test' from incompatible pointer type
[enabled by default]
test.c:1:6: note: expected 'const char * const*' but argument is of type 'char **'

这使我相信我在这里所做的事情在某种程度上是错误的。有没有更好的方法将参数传递给函数,并指示它应该const由接收函数考虑?

4

2 回答 2

12

C FAQ解释了为什么在将指针转换为非const指向时在 C 中存在安全防护const。我认为,在您的双重const限定目标指针的情况下,不会发生所描述的问题。所以 C++ 有一个宽松的规则,允许你要求的隐式转换。不幸的是,对于 C,标准委员会发现 C++ 的规则过于复杂,因此您必须将指针转换为预期的类型。

于 2012-10-20T20:47:34.270 回答
1

您可以将其转换为:

void test(const char * const *arr);

int main(int argc, char *argv[], char *env[])
{
   test((const char * const *)argv);
}

void test(const char * const *arr)
{
}

这将使警告消失。这没关系,只要您实际上可以在您的函数argv中将其视为 a const char * const *

于 2012-10-20T20:41:33.983 回答