如何在C中显式地从const类型转换为type?

时间:2017-07-31 16:00:20

标签: c

如果我通过gcc编译以下代码(在文件“myfile.c”中):

void bar(int *pi)
{
    /* do something */
}

foo(const int *pi)
{
    bar(pi);
}

使用以下命令行:

gcc    myfile.c    -ansi    -pedantic-errors

我收到以下错误:

error: passing argument 1 of 'bar' discards 'const' qualifier from pointer target type [-Wdiscarded-qualifiers]  
    bar(pi);

note: expected 'int *' but argument is of type 'const int *'
    void bar(int *pi)

我的问题是,如果不更改命令行,如何避免此错误? E.I.只需在foo中编写一些代码,因为我无法更改barfoo原型。

1 个答案:

答案 0 :(得分:4)

首先,const - 只要实际指针指向非const位置,就可以抛弃foo(const int *pi) { bar((int*)pi); // <<== Be very careful with this! } -

pi

这里的假设是const实际上是非const指针,所以最好的做法是让编译器通过从{{1}中删除foo来强制执行它宣言:

void foo(int *pi) { // Remove const
    ...
}

如果您不能这样做,并且由于bar在没有int限定符的情况下使用const指针,则需要将其传递给可以写入的位置。例如,如果这是单个项目而不是数组,则可以复制指针指向的内容,并将其传递给函数:

void bar(int *pi, size_t n) {
    /* do something */
}
foo(const int *pi) {
    int tmp = *pi;
    bar(&tmp);
}

如果pi指向一个n元素数组,则需要为其创建一个临时缓冲区:

void bar(int *pi, size_t n) {
    /* do something */
}
foo(const int *pi, size_t n) {
    int *buf = malloc(sizeof(int) * n);
    memcpy(buf, pi, sizeof(int) * n);
    bar(buf, n);
    free(buf);
}