> 文章列表 > 【Linux C/C++】关于结构体定义,typedef关键字的使用场景

【Linux C/C++】关于结构体定义,typedef关键字的使用场景

【Linux C/C++】关于结构体定义,typedef关键字的使用场景

typedef关键字修饰结构体声明的优劣

优势:
在C语言中,可以使用两种方式来定义结构体类型:使用struct关键字和使用typedef关键字。使用struct关键字定义结构体类型时,需要在定义时同时指定结构体的名称和成员变量,例如:

struct Person {char name[20];int age;
};

使用typedef关键字定义结构体类型时,可以将结构体类型重命名为一个新的类型名,例如:

typedef struct {char name[20];int age;
} Person;

这样,就可以直接使用Person作为结构体类型名,而不需要再使用struct关键字。但是,如果只是使用typedef关键字定义结构体类型,而没有指定结构体的名称,那么这个结构体类型就无法被直接使用,例如:

typedef struct {char name[20];int age;
} ;

这个结构体类型没有名称,无法被直接使用,因此在定义命名结构体时,需要同时使用struct关键字和typedef关键字,例如:

typedef struct Person {char name[20];int age;
} Person;

这样就可以定义一个命名为Person的结构体类型,并且可以直接使用Person作为结构体类型名。因此,在C语言中,命名结构体通常使用struct和typedef关键字的组合来定义。
缺点:

不使用typedef定义结构体类型的好处是可以更加清晰地表达代码的含义,避免类型混淆和歧义。当我们在代码中使用结构体类型时,如果没有使用typedef关键字,那么我们需要在每次使用结构体类型时都要加上struct关键字,例如:

struct Person {char name[20];int age;
};int main() {struct Person p1;// ...return 0;
}

这样虽然有些繁琐,但是可以更加明确地表达p1是一个结构体类型的变量。如果我们使用了typedef关键字,那么可以直接使用新的类型名来代替结构体类型名,例如:

typedef struct {char name[20];int age;
} Person;int main() {Person p1;// ...return 0;
}

这样虽然更加简洁,但是可能会导致类型混淆和歧义。如果我们在代码中定义了多个类似的结构体类型,使用不同的typedef名称来代替结构体类型名,那么可能会导致代码的可读性和可维护性降低。因此,在一些需要更加清晰地表达代码含义的场景下,不使用typedef定义结构体类型可能更加合适。

当我们在代码中定义了多个类似的结构体类型,并且使用了不同的typedef名称来代替结构体类型名时,容易导致类型混淆和歧义。例如:

typedef struct {char name[20];int age;
} Person;typedef struct {char name[20];char address[50];
} Employee;int main() {Person p1;Employee e1;// ...return 0;
}

在这个例子中,我们定义了两个类似的结构体类型Person和Employee,并且使用了不同的typedef名称来代替结构体类型名。虽然这样可以让代码更加简洁,但是也容易导致类型混淆和歧义。例如,如果我们在代码中使用了一个变量p1,那么很难确定它是Person类型的变量还是Employee类型的变量。因此,在这种情况下,不使用typedef定义结构体类型可能更加合适,可以让代码更加清晰易懂。