如果我通过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
中编写一些代码,因为我无法更改bar
和foo
原型。
答案 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);
}