gpt4 book ai didi

c - Bar 的第一个成员是 Foo 结构,任何对 Bar 的引用也是对 Foo 的有效引用

转载 作者:太空宇宙 更新时间:2023-11-04 07:50:56 24 4
gpt4 key购买 nike

标题中的陈述在什么情况下是正确的?适用于哪个版本的 C 和哪些编译器选项?

我的问题源于史蒂夫的陈述:“你现在应该注意到——因为我们的 FooSubclass 的第一个成员实际上是一个 Foo 结构——任何对 FooSubclass 的引用也是对 Foo 的有效引用——这意味着它几乎可以在任何地方使用。”(MVC implemented in pure C ) 第一次看到有人提这样的事情。以下代码引发了警告,因此我质疑此声明的有效性。

#include <stdio.h>
#include <assert.h>

typedef struct Foo {
int weight;
} Foo;

Foo foo_init(int weight) {
Foo t;
t.weight = weight;
return t;
}

int foo_weight(const Foo *this) {
return this->weight;
}

typedef struct Bar {
Foo base;
int size;
} Bar;

Bar bar_init(int weight, int size) {
Bar w;
w.base = foo_init(weight);
w.size = size;
return w;
}

int bar_weight(const Bar *this) {
return foo_weight(this);
}

int bar_size(const Bar *this) {
return this->size;
}

int main (int argc, char *argv[]) {
Foo t = foo_init(22);
Bar w = bar_init(20,14);

assert(foo_weight(&t) == 22);
assert(bar_weight(&w) == 20);
assert(bar_size(&w) == 14);

return 0;
}

结果:

> gcc main.c

main.c: In function 'bar_weight':
main.c:31:20: warning: passing argument 1 of 'foo_weight' from incompatible pointer type [-Wincompatible-pointer-types]
return foo_weight(this);
^~~~
main.c:14:5: note: expected 'const Foo * {aka const struct Foo *}' but argument is of type 'const Bar * {aka const struct Bar *}'
int foo_weight(const Foo *this) {

最佳答案

In which condition is the statement in the title true?

没有条件。正确的说法是“Bar 的第一个成员是 Foo 结构,对 Bar 的任何引用都可以强制转换为对 Foo 的有效引用”

这在 6.7.2.1p15 的 C 标准中有记录:

6.7.2.1 Structure and union specifiers

5 A pointer to a structure object, suitably converted, points to its initial member (or if that member is a bit-field, then to the unit in which it resides), and vice versa. There may be unnamed padding within a structure object, but not at its beginning.

自关于 C 的概念以来一直如此。

关于c - Bar 的第一个成员是 Foo 结构,任何对 Bar 的引用也是对 Foo 的有效引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53912435/

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