将非const参数传递给需要const参数的函数时发出警告。有没有更好的办法?

时间:2012-10-20 20:32:27

标签: c gcc const

我正在尝试将参数传递给函数,并指示接收函数应该将该参数视为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

2 个答案:

答案 0 :(得分:11)

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

答案 1 :(得分: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视为const char * const *