假设我想定义两个结构,第一个有一个类型,另一个我想与第一个具有相同的类型。这在 C99 中可能吗?
例子:
typedef struct {
fieldA;
fieldB;
} typeA;
struct B {
fieldA
fieldB
};
Run Code Online (Sandbox Code Playgroud)
typedef B A;
如果不是 typedef,是否还有其他关键字/方法可以做到这一点?
编辑:从目前的反馈来看,我似乎没有尽可能清楚(我非常感谢!)
我的特定场景是 typedef 结构定义,需要为另一个结构键入别名。
小智 5
是的当然!就像:
#include <stdio.h>
typedef int value_t;
typedef value_t data_t;
int main()
{
data_t i = 1;
printf("%d\n", i);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
您可以随意typedef多次。
简短的回答:不,那是不可能的。至少不符合任何 ISO-C 标准。
长答案:结构类型是编译时构造,而不是运行时构造。在运行时,结构只是堆栈或堆上的一堆字节,访问结构字段的代码只是访问特定偏移量处特定长度的值(代码只知道从结构体开头的哪个偏移量获取多少字节) )。该结构本身根本不存储在编译的代码中。
因此,任何可以处理的代码typeA都同样能够处理struct B,因为它们在内存中是相同的,但在编译时编译器将强制它们是不同的类型,因为 C 类型不是由“它们的外观”定义的,而只是由“它们的外观”定义的以他们的名字。atypedef只是为给定类型设置一个替代名称。
按名称定义类型背后的逻辑是,而从技术上讲,这与内存中的值相同:
struct IPAddress { uint32_t addr; };
struct Count { uint32_t count; };
Run Code Online (Sandbox Code Playgroud)
它仍然不是一种可互换的类型,因为一个是计数器值,一个是 IP 地址,并且您不应该将一个类型传递给需要另一个类型的函数。如果两种类型确实意味着相同的事情,为什么一开始就有两种类型呢?所以我猜你想要的是继承和多态性,而这在 C 中是不可用的。
什么是允许的并且实际上会起作用的是
void handleA ( typeA * value );
// ...
struct B bValue = { ... };
handleA((typeA *)&b);
Run Code Online (Sandbox Code Playgroud)
这是允许的并且安全的,因为两种类型具有相同的内存对齐和大小,这与具有相同的字段无关。即使它们具有完全不同的字段,它们仍然可以具有相同的内存对齐和大小,这是强制转换符合标准所必需的。
| 归档时间: |
|
| 查看次数: |
3136 次 |
| 最近记录: |