gpt4 book ai didi

c - 回顾 typedef'ing struct 的 2 种不同方法

转载 作者:太空狗 更新时间:2023-10-29 16:09:37 26 4
gpt4 key购买 nike

gcc 4.4.4 c89

在使用结构体隐藏实现文件中的元素时,我总是这样做。

port.h头文件

struct port_tag;
struct port_tag* open_ports(size_t port_id);
void close_ports(struct port_tag *port);

port.c实现文件

#include "port.h"
typedef struct port_tag {
size_t port_id;
} port_t;

port_t* open_ports(size_t port_id)
{
port_t *port = malloc(sizeof *port);
if(port == NULL) {
return NULL;
}
port->port_id = port_id;
return port;
}

void close_ports(port_t *port)
{
if(port != NULL) {
free(port);
}
}

driver.c驱动文件

#include "port.h"
int main(void)
{
size_t i = 0;
struct port_tag *port = NULL;

for(i = 0; i < 5; i++) {
port = open_ports(i);

if(port == NULL) {
fprintf(stderr, "Port [ %d ] failed to open\n", i);
}
close_ports(port);
}
return 0;
}

在上面的代码中很明显,标签名称是 port_tag,实际类型定义的名称是 port_t。

但是,我正在重新设计一些代码。而且我发现他们使用了一种我以前从未见过的不同方法。我对他们的方法有几个问题。

channel.h头文件

typedef struct channel_t channel_t;
channel_t* open_channels(size_t channel_id);
void close_channels(channel_t *channel);

channel.c实现文件

#include "channel.h"
struct channel_t {
size_t channel_id;
};

channel_t* open_channels(size_t channel_id)
{
channel_t *channel = malloc(sizeof *channel);

if(channel == NULL) {
return NULL;
}
channel->channel_id = channel_id;
return channel;
}

void close_channels(channel_t *channel)
{
if(channel != NULL) {
free(channel);
}
}

driver.c驱动文件

#include "channel.h"   
int main(void)
{
size_t i = 0;
channel_t *channel = NULL;

for(i = 0; i < 5; i++) {
channel = open_channels(i);

if(channel == NULL) {
fprintf(stderr, "Channel [ %zu ] failed to open\n", i);
}

close_channels(channel);
}
return 0;
}

1) 当他们声明了 typedef'ed struct 时,它是标签名称或结构本身?

typedef struct channel_t channel_t;

2) 在实现文件中,结构的名称不应该跟在最后一个大括号之后吗?

struct channel_t <-- tag name {
size_t channel_id;
} <-- itsn't this the name of the typedef'ed struct;

非常感谢任何建议,

最佳答案

1.结构类型是struct channel_t,新的typedef是channel_t

这意味着它现在可以用作:

channel_t some_instance;

2。他们在别处创建 typedef,而不是这里。所以所有:

struct channel_t {
size_t channel_id;
};

是用标签channel_t定义一个结构类型。定义 struct 时不需要 typedef。它可以用作,例如:

struct channel_t some_instance;

如您所见,在这种情况下,这两种语法基本上是等同的。

关于c - 回顾 typedef'ing struct 的 2 种不同方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4201585/

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