C 在结构和枚举上使用或不使用typename的Typedef,各有哪些优点/缺点,最佳做法是什么?
编辑:关于以意见为基础结束问题。 我特别想要的是任何严格客观而非主观性的东西。如果不存在客观差异,则说明存在客观差异的答案将打勾。不过,似乎存在明确的客观差异C 在结构和枚举上使用或不使用typename的Typedef,各有哪些优点/缺点,最佳做法是什么?,c,struct,enums,typedef,c99,C,Struct,Enums,Typedef,C99,编辑:关于以意见为基础结束问题。 我特别想要的是任何严格客观而非主观性的东西。如果不存在客观差异,则说明存在客观差异的答案将打勾。不过,似乎存在明确的客观差异 关于如何以及为什么在C中使用typedef,这里有很多问题,但似乎没有一个问题描述应该使用哪个用例,或者每个用例的优缺点 关于这个主题的大多数问题都围绕这一点 结构栏{ int值; }; 结构Foo{ int值; }; typedef结构Foo-Foo; 结构栏mybar;//必须添加关键字struct才能工作 Foo myfoo;//
关于如何以及为什么在C中使用typedef,这里有很多问题,但似乎没有一个问题描述应该使用哪个用例,或者每个用例的优缺点 关于这个主题的大多数问题都围绕这一点
结构栏{
int值;
};
结构Foo{
int值;
};
typedef结构Foo-Foo;
结构栏mybar;//必须添加关键字struct才能工作
Foo myfoo;//在没有struct关键字的情况下工作
我的问题更多的是什么是最佳实践,或者出于哪些原因应该避免什么?使用下面的任何一个例子会有问题吗?或者,如果由于上下文的原因,答案不同,那么给出的例子的优缺点是什么
//1
类型定义结构{
int值;
}傅;
//2
typedef结构Foo{
int值;
}傅;
/3
类型定义结构Foo_s{
int值;
}富特;
/4
typedef结构Foo{
int值;
}富特;
这些都应该避免吗?为什么?如果其中任何一个不是很好,那么相同的精确点是否对枚举有效?我觉得整个主题有点模糊,而且我在这个问题上至少没有发现任何明确的东西,所以我只是在反复检查,以便以后没有任何东西回来咬我
如果还有其他变体,我可以添加它们。对于快速阅读和不同名称的误用混淆,我建议使用以下表格:
typedef struct Foo {
int value;
} Foo;
没有对错之分,但都是关于个人喜好和实践。对于快速阅读和误用不同名称的混淆,我建议使用以下表格:
typedef struct Foo {
int value;
} Foo;
没有对错之分,但都是关于个人偏好和实践。在类似于此的typedef声明中
// 1
typedef struct {
int value;
} Foo;
不能在结构定义中引用该结构。例如,您不能声明表示链表节点的结构,因为在该结构中,您需要引用指向指向下一个节点的结构类型的指针
在这个typedef定义中
// 3
typedef struct Foo_s {
int value;
} Foo_t;
// 4
typedef struct Foo {
int value;
} Foo_t;
// 2
typedef struct Foo {
int value;
} Foo;
两个不同的名称Foo\u s
和Foo\u t
只会让代码的读者感到困惑。例如,它可以这样写
struct Foo_s f = malloc( sizeof( Foo_t ) );
或
这是typedef定义
// 3
typedef struct Foo_s {
int value;
} Foo_t;
// 4
typedef struct Foo {
int value;
} Foo_t;
// 2
typedef struct Foo {
int value;
} Foo;
他也有同样的问题。例如,如果您将遇到两个这样的声明
struct Foo f1;
及
很难说这两种类型是否相同
所以我更喜欢下面的typedef定义
// 3
typedef struct Foo_s {
int value;
} Foo_t;
// 4
typedef struct Foo {
int value;
} Foo_t;
// 2
typedef struct Foo {
int value;
} Foo;
现在您知道标识符
Foo
是为结构保留的 在与此类似的typedef声明中
// 1
typedef struct {
int value;
} Foo;
不能在结构定义中引用该结构。例如,您不能声明表示链表节点的结构,因为在该结构中,您需要引用指向指向下一个节点的结构类型的指针
在这个typedef定义中
// 3
typedef struct Foo_s {
int value;
} Foo_t;
// 4
typedef struct Foo {
int value;
} Foo_t;
// 2
typedef struct Foo {
int value;
} Foo;
两个不同的名称Foo\u s
和Foo\u t
只会让代码的读者感到困惑。例如,它可以这样写
struct Foo_s f = malloc( sizeof( Foo_t ) );
或
这是typedef定义
// 3
typedef struct Foo_s {
int value;
} Foo_t;
// 4
typedef struct Foo {
int value;
} Foo_t;
// 2
typedef struct Foo {
int value;
} Foo;
他也有同样的问题。例如,如果您将遇到两个这样的声明
struct Foo f1;
及
很难说这两种类型是否相同
所以我更喜欢下面的typedef定义
// 3
typedef struct Foo_s {
int value;
} Foo_t;
// 4
typedef struct Foo {
int value;
} Foo_t;
// 2
typedef struct Foo {
int value;
} Foo;
现在您知道标识符
Foo
是为结构保留的 大多数情况的权重都基于代码可读性/便利性/偏好和限制等因素
typedef struct {
int value;
} Foo;
示例1:一个是正确的,如果出于某种原因,您正在寻找方便和更短的代码/代码行,但它的局限性是,您只能像fooa那样使用它代码>而非struct Foo a代码>
typedef struct Foo {
int value;
} Foo;
typedef struct Foo_s {
int value;
} Foo_t;
例2。与示例1相似,但声明限制除外,在示例2中,您可以声明Likefooa代码>和struct Foo a代码>
typedef struct Foo {
int value;
} Foo;
typedef struct Foo_s {
int value;
} Foo_t;
示例3:该示例具有1和2所没有的可读性/可维护性因素。就像其他人,甚至是你自己,将来会看代码一样,3肯定会更好地阅读和理解,而不会混淆类型名称。这就是为什么在许多地方对typedefs/enums/structs这样的东西命名是一种标准
typedef struct Foo {
int value;
} Foo_t;
例4:4和3的情况相同,大多数情况下,它们的权重基于代码可读性/便利性/偏好和限制等因素
typedef struct {
int value;
} Foo;
示例1:一个是正确的,如果出于某种原因,您正在寻找方便和更短的代码/代码行,但它的局限性是,您只能像fooa那样使用它代码>而非struct Foo a代码>
typedef struct Foo {
int value;
} Foo;
typedef struct Foo_s {
int value;
} Foo_t;
例2。与示例1相似,但声明限制除外,在示例2中,您可以声明Likefooa代码>和struct Foo a代码>
typedef struct Foo {
int value;
} Foo;
typedef struct Foo_s {
int value;
} Foo_t;
示例3:该示例具有1和2所没有的可读性/可维护性因素。就像其他人,甚至是你自己,将来会看代码一样,3肯定会更好地阅读和理解,而不会混淆类型名称。这就是为什么在许多地方对typedefs/enums/structs这样的东西命名是一种标准
typedef struct Foo {
int value;
} Foo_t;
例4:与例3相同,您的回答将意味着这两种方案都没有技术上的优点/缺点,只有主观上的差异。这是对的吗?@trondhe肯定。但是,您可以对此进行关联以获取更多信息。它说明了必须在标记命名空间(在c++中)中定义的差异,以便进行正向声明。这对c也是有效的吗?还有另一个注释:它只是ca