Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在结构和枚举上使用或不使用typename的Typedef,各有哪些优点/缺点,最佳做法是什么?_C_Struct_Enums_Typedef_C99 - Fatal编程技术网

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中,您可以声明Like
fooa
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中,您可以声明Like
fooa
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