在C中声明一个结构而不定义它

时间:2016-04-08 20:08:16

标签: c struct declaration

我想在C中声明一个结构而不同时定义它(即分离接口和实现),以便其他人可以在项目中包含它并根据需要定义它(它仅用作参数在我的代码中)。因此,我想知道这是不是:

A)可能(可能只是使用宏)?

B)考虑好的做法(在我的特殊情况下)?

如果没有上下文(并且仍然是主观的),B很难回答,所以我只想检查C中用于解决给定上下文(如果有的话)的任何常见的预先存在的模式。我有以下代码:

<div id="A">
    <a href='#'>Test A1</a>
    <div id="B">
        <a href='#'>Test B</a>
    </div>
    <div id="C">
        I'm in C
    </div>
    <a href='#'>Test A2</a>

我想这样(伪代码):

typedef struct {
    bool logged_in;
} Foo;

因此,此声明可以由在其项目中包含此声明的人员定义。在我的代码中,我只使用它作为参数而不试图访问它包含的属性,如下所示:

typedef struct Foo;

感谢。

2 个答案:

答案 0 :(得分:4)

转发声明如下:

typedef struct Foo Foo;

然后用它的'全名'来定义它:

struct Foo {
    …
};

或者您可以直接声明'全名':

struct Foo;

并使用:

bool bar(struct Foo *foo) {
    …
}

答案 1 :(得分:1)

你尝试过吗?这为我编译而没有GCC的警告:

enum WSType {
    ACK,
    REQUEST,
    RESPONSE,
}

impl WSType {
    fn to_str(&self) -> &str {
        match self {
            ACK => "ACK",
            REQUEST => "REQUEST",
            RESPONSE => "RESPONSE",            
        }
    }
}

fn main() {
    let val = "ACK";
    // test
    match val {
        ACK.to_str() => println!("ack"),
        REQUEST.to_str() => println!("ack"),
        RESPONSE.to_str() => println!("ack"),
        _ => println!("unexpected"),
    }
}

我不知道你为什么不想这样做的原因。