gpt4 book ai didi

c++ - 函数定义与其在 C 中的声明不匹配,但在 C++ 中匹配

转载 作者:太空狗 更新时间:2023-10-29 23:39:54 30 4
gpt4 key购买 nike

当以下代码中没有struct bar 的可见声明或定义时,它作为 C++ 成功编译但不是 C:

void foo(struct bar* p);

void foo(struct bar* p){}

int main(){}

编译为 C 时的错误消息:错误:“foo”的类型冲突

谁能解释这种行为?

我已经用这两个 clang++ 3.4 试过了和 g++ 4.8.2带有 -Wall -Wextra -pedantic-errors 标志和分别用于 C 和 C++ 的 -std=c99-std=c++03 .

最佳答案

让我们通过省略声明和无用的 main 来简化程序:

void foo(struct bar* p){}

编译器看到struct bar,它还没有被定义。 GCC 4.8.2 的错误消息解释了它接下来的操作:

a.c:1:17: warning: ‘struct bar’ declared inside parameter list [enabled by default]
void foo(struct bar* p){}
^
a.c:1:17: warning: its scope is only this definition or declaration, which is probably not what you want [enabled by default]

现在它假设 struct bar 是只存在于 foo 定义中的东西。不过,代码可以完美编译。

添加函数原型(prototype)时:

void foo(struct bar* p);

void foo(struct bar* p){}

警告变成:

a.c:1:17: warning: ‘struct bar’ declared inside parameter list [enabled by default]
void foo(struct bar* p);
^
a.c:1:17: warning: its scope is only this definition or declaration, which is probably not what you want [enabled by default]
a.c:3:17: warning: ‘struct bar’ declared inside parameter list [enabled by default]
void foo(struct bar* p){}
^
a.c:3:6: error: conflicting types for ‘foo’
void foo(struct bar* p){}
^
a.c:1:6: note: previous declaration of ‘foo’ was here
void foo(struct bar* p);
^

和以前一样,编译器为原型(prototype)创建了一个新的未定义类型 struct bar,为函数定义创建了一个另一个。所以 foo 的原型(prototype)和它的定义引用了不同的类型,都命名为 struct bar。它们不匹配,因此出现错误。

解决方案是先转发声明struct:

struct bar;

void foo(struct bar* p);

void foo(struct bar* p){}

编译时没有警告。

关于c++ - 函数定义与其在 C 中的声明不匹配,但在 C++ 中匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26573336/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com