【发布时间】:2021-08-24 12:06:39
【问题描述】:
在制作以下代码时:
#include <general.dep>
typedef struct {
} obj;
int f1(obj **o) {
return 0;
}
int f2(obj *const *o) {
return 0;
}
int f3(const obj **o) {
return 0;
}
int f4(const obj *const *o) {
return 0;
}
int main() {
obj **o;
f1(o);
f2(o);
f3(o);
f4(o);
return 0;
}
我收到以下警告消息:
gcc t1.c -I/home/hamidi/code/lib/general/inc -fmax-errors=1 -lgeneral -llzma -pthread -o t1
t1.c: In function ‘main’:
t1.c:26:6: warning: passing argument 1 of ‘f3’ from incompatible pointer type [-Wincompatible-pointer-types]
26 | f3(o);
| ^
| |
| obj ** {aka struct <anonymous> **}
t1.c:14:20: note: expected ‘const obj **’ {aka ‘const struct <anonymous> **’} but argument is of type ‘obj **’ {aka ‘struct <anonymous> **’}
14 | int f3(const obj **o) {
| ~~~~~~~~~~~~^
t1.c:27:6: warning: passing argument 1 of ‘f4’ from incompatible pointer type [-Wincompatible-pointer-types]
27 | f4(o);
| ^
| |
| obj ** {aka struct <anonymous> **}
t1.c:18:26: note: expected ‘const obj * const*’ {aka ‘const struct <anonymous> * const*’} but argument is of type ‘obj **’ {aka ‘struct <anonymous> **’}
18 | int f4(const obj *const *o) {
| ~~~~~~~~~~~~~~~~~~^
如何解决这些警告问题?
更新
我标记了以下发出警告的函数:
void f0(obj **ppo) {}
void f1(const obj **ppo) {} //
void f2(obj const **ppo) {} //
void f3(obj *const *ppo) {}
void f4(obj **const ppo) {}
void f5(const obj const **ppo) {} //
void f6(const obj *const *ppo) {} //
void f7(const obj **const ppo) {} //
void f8(obj const *const *ppo) {} //
void f9(obj const **const ppo) {} //
void fa(obj *const *const ppo) {}
void fb(const obj const *const *ppo) {} //
void fc(const obj const **const ppo) {} //
void fd(const obj *const *const ppo) {} //
void fe(obj const *const *const ppo) {} //
void ff(const obj const *const *const ppo) {} //
我不确定哪些是等价的。似乎 f2 和 f3 不同,因为 f2 发出警告而 f3 没有。那么,我们可以说obj const * 与obj *const 不同吗?
更新 2
obj 的 const 可以放在它之前或之后,但对于指针,它应该放在它们之后。所以,让我们把两者都放在 const 之后。现在我的问题是在以下代码中:
void f(int const* const* ppi) {
//**ppi = **ppi;
//*ppi = *ppi;
ppi = ppi;
}
void g(int const* pi) {
//*pi = *pi;
pi = pi;
}
int main() {
int i, *pi = &i, **ppi = π
f(ppi);
g(pi);
return 0;
}
我调用了两个函数,f & g。两个函数原型都表明参数的内容没有改变。 g不改变指针的内容,f不改变指针的内容和指针内容指向的内容。
现在我的问题是,为什么编译器仅在调用 f 而不是 g 时才发出此警告?!如果 f 要说我不打算改变指针的内容和它所指向的内容,那么它的原型应该是什么?
warning: passing argument 1 of ‘f’ from incompatible pointer type [-Wincompatible-pointer-types]
16 | f(ppi);
| ^~~
| |
| int **
t2.c:3:26: note: expected ‘const int * const*’ but argument is of type ‘int **’
3 | void f(int const* const* ppi) {
| ~~~~~~~~~~~~~~~~~~^~~
【问题讨论】:
-
是的。
const obj const、const obj和obj const都是一样的。当*变成**时,编译器发出警告,指出指针指向的实体在调用者和被调用函数中不同,而如果这是一个问题,那么当*时也应该是一个问题用来。我的问题正是这个。*和**这两者有什么区别。为什么我使用*时没有报告问题? -
are all the same是的。When * turns into **我不明白那部分。* and **这些只是明星。what the issue is not reported when I use *?因为语言是以这种方式创建的并且允许这样做。 port70.net/~nsz/c/c11/n1570.html#6.5.16.1p1 和 port70.net/~nsz/c/c11/n1570.html#6.5.16.1p6 和 port70.net/~nsz/c/c11/n1570.html#note112 和 -
您使用哪种语言?注意 C 和 C++ 是不同的语言。在 C++ 中,
int **类型的参数与int const* const*类型的参数兼容,而在 C 中则不兼容。标签gcc属于 GNU Compiler Collection,其中包含 C 编译器、C++ 编译器等。 -
纯C。我用g++编译C++。
-
去掉无关标签,添加相关标签
标签: c