typedef与struct结构体定义
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;
}