簡體   English   中英

回顧2種不同的typedef結構的方法

[英]review of 2 different methods of typedef'ing a struct

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,實際的typedef名稱是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結構,它是標簽名稱或結構本身的名稱?

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;

他們在其他地方創建了一個typedef,而不是在這里。 所以:

struct channel_t {
    size_t channel_id;
};

確實是使用標記channel_t定義結構類型。 定義struct時不需要typedef。 它可以用作,例如:

struct channel_t some_instance;

如您所見,在這種情況下,這兩種語法基本相同。

typedef struct channel_t channel_t;

這意味着也可以使用名稱“channel_t”來引用名為“struct channel_t”的結構。 沒有沖突,因為前一種類型的名稱是“struct channel_t”而不僅僅是“channel_t”。

至於(2),那只是定義結構。 typedef行只是一個typedef,它沒有定義結構。 當您只希望API提供類型安全性(而不是使用“void *”)時,通常使用此模式(標頭中沒有結構定義,源中的結構定義),而不暴露結構的內部。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM