gpt4 book ai didi

指向不完整结构类型和后来的结构类型完成 VS 的 C 指针。指向未声明类型 T_t 和稍后类型 T_t 声明的指针

转载 作者:行者123 更新时间:2023-12-02 15:49:54 25 4
gpt4 key购买 nike

以下是C语言的合法片段:

/* Example 1. */

struct B *p; /* p: pointer to incomplete struct type B */

/* This declaration completes the struct type B. */
struct B {
int foo;
};

只要在提供结构类型 B 的完整类型信息之前没有对 p 执行指针操作(例如 p++),该片段就是合法的 C。

另一方面,下一个片段在 C: 中是非法的:

/* Example 2. */

T_t *p; /* p: pointer to undeclared type T_t. */

typedef int T_t;

问题:为什么在 C 语言中声明一个指向不完整结构类型的指针并稍后提供完整的结构类型信息(示例 1)是合法的,而声明一个指向一个结构类型的指针是非法的?未声明的类型并稍后声明类型(示例 2)?

最佳答案

因为 struct 关键字,即使在声明 struct B 之前,就知道 struct B 指的是哪种实体。它是一种类型 --- 一种 struct 类型,更准确地说。它是一个不完整的类型,因为还没有看到 struct B 的声明。但对于某些用途,例如声明一个指针,这就足够了。

另一方面,还不知道T_t 是什么。它是一种类型吗?它是一个变量吗?它是一个函数吗?它是一个枚举器吗?如果它是一个类型,我们就可以了。如果不是,则此声明要么没有意义,要么更糟,根据 T_t 是什么,它具有不止一种含义。

C 语言的定义方式使得编译器不需要向前看太多。它从上到下阅读并当场决定。 T_t *p; 是否可以根据已经看到的内容进行明确解释?如果不是,那么它是无效的。

关于指向不完整结构类型和后来的结构类型完成 VS 的 C 指针。指向未声明类型 T_t 和稍后类型 T_t 声明的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72881340/

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