typedef与struct结构体定义

定义结构体别名

C语言中结构体名不可单独作类型使用,而别名可当类型直接使用

typedef struct Student
{
   int 	cnt;
   char name[12];
}Student;

Student stu;//stu是变量,其类型是Student
struct Student stu;//stu是变量,其类型是struct Student

为避免命名混乱,建议别名和结构体本名一致

//匿名结构体,定义时绑定别名,不推荐
typedef struct
{
   int 	cnt;
   char name[12];
}Student;

Student stu;//stu是变量,其类型是Student
struct Student
{
   int 	cnt;
   char name[12];
};

struct Student stu;//stu是变量,其类型是struct Student

typedef struct Student Student;
Student stu;//stu是变量,其类型是Student

声明结构体变量

struct Student
{
   int 	cnt;
   char name[12];
}Stu;

int a = Stu.cnt;//Stu是结构体类型的变量

匿名结构体

在 C++11 中,没有名字的类是没法显式写构造的,由于有C++11的non-static member in-class initialization,通常情况下可以直接写:

struct {
    int  count = 0;
    bool done  = false;
} abc;

如果坚持要在构造里做点事情:根据C++ RAII的精神,构造和析构是对成员递归的,可以构造一个成员来帮忙执行一段函数:

struct AutoExec
{
    template<typename Callable>
    AutoExec(Callable&& callable)
    {
        callable();
    }
};

struct
{
    AutoExec wtf{[]{
        std::cout << "anonymous constructor called.\n";
    }};
} abc;

其中AutoExec类的唯一用途就是把任意函数(或functor,lambda)通过模板构造函数执行掉,于是就可以再结合成员初始化来代替匿名类的构造了。

通过lambda函数捕获,执行构造行为:

#include <iostream>

int main(){
    struct {
        void *p_this;
        int i = [this](){
            p_this = this;
            return 0;
        }();
    } foo;
    std::cout << &foo << '\n'
    << foo.p_this << std::endl;
    return 0;
}