C中的结构声明和定义

Laz*_*zar 2 c struct compilation declaration definition

如果我们这样写:

typedef struct 
{
    unsigned int counter;
} MyStruct;
Run Code Online (Sandbox Code Playgroud)

这代表结构声明?

声明说我们的编译器在某处有一个结构,其参数的类型和大小与上述类似,并且在声明的情况下,在内存中没有为该结构保留空间。

定义是,因为现在我们在内存中为我们的结构保留了一个空间:

MyStruct tmpStruct;
Run Code Online (Sandbox Code Playgroud)

还是我错了?

请用结构说明情况。

das*_*ght 5

C 中有不同种类的定义 - 类型定义、变量定义和函数定义。类型和函数也可以在没有定义的情况下进行声明。

typedef的不是声明,而是type的定义。除了定义struct没有标签的a 之外,它还定义了一个对应于那个 的类型名称struct

a 的声明struct如下所示:

typedef struct MyStruct MyStruct;
Run Code Online (Sandbox Code Playgroud)

这将允许您声明指向 的指针MyStruct,前向声明的函数,MyStruct*等等:

void foo(MyStruct* p);
Run Code Online (Sandbox Code Playgroud)

您拥有的是类型变量的声明/定义MyStruct

MyStruct tmpStruct;
Run Code Online (Sandbox Code Playgroud)

这是一个完整的示例,其中struct的声明与其定义分开:

#include <stdio.h>
// Here is a declaration
typedef struct MyStruct MyStruct;
// A declaration lets us reference MyStruct's by pointer:
void foo(MyStruct* s);
// Here is the definition
struct MyStruct {
    int a;
    int b;
};
// Definition lets us use struct's members
void foo(MyStruct *p) {
    printf("%d %d\n", p->a, p->b);
}

int main(void) {
    // This declares a variable of type MyStruct
    MyStruct ms = {a:100, b:120};
    foo(&ms);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

演示。