「生活可以更简单, 欢迎来到我的开源世界」
  1. 定义结构体别名
  2. 声明结构体变量
  3. 匿名结构体
typedef与struct结构体定义
2020-12-11
C++

typedef与struct结构体定义

定义结构体别名

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

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是结构体类型的变量

匿名结构体

此部分内容来自:

作者:胖财
链接:https://www.zhihu.com/question/52192165/answer/186769538
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

作者:暮无井见铃
链接:https://www.zhihu.com/question/52192165/answer/188270223
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

在 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;
}
<⇧>