没有typedef关键字

时间:2015-09-18 15:52:07

标签: c data-structures struct

我目前正在了解C中的struct数据结构,以及如何使用typedef关键字为此结构添加前言。这会导致实际结构的变量名称放在不同的名称空间中,如几个不同的引用中所述:

Difference between 'struct' and 'typedef struct' in C++?

typedef struct vs struct definitions

但是,目前还不清楚我正在使用的示例中发生了什么:

#include <stdio.h>

struct demo
{
    short low_pass_vcf;
    short filter_coupler;
    short reverb;
    short sequential;
} synth;

int main() 
{    
    printf("Size of struct: %i\n", sizeof(struct demo));
    printf("Size of struct: %i\n", sizeof(synth));
    return 0;
}

在此示例中,我可以通过struct变量名访问synth数据结构;但是,在我看到的示例中,为了使我能够执行此操作,struct需要以typedef开头。在此示例中,未使用typedef,但我仍然可以通过synth引用此结构。我想知道C允许我这样做到底发生了什么?任何解释将不胜感激。欢呼声。

5 个答案:

答案 0 :(得分:8)

struct demo
{
    short low_pass_vcf;
    short filter_coupler;
    short reverb;
    short sequential;
} synth;

与:

相同
// declare struct demo
struct demo
{
    short low_pass_vcf;
    short filter_coupler;
    short reverb;
    short sequential;
};

// define struct variable synth
struct demo synth;

现在您可以访问结构成员,例如:

synth.sequential = 1;

sizeof(struct demo)会返回struct demo的大小。

sizeof(synth)返回具体实例synth的大小。

在这种情况下,两者都返回相同的大小。

<强>更新

使用typedef可能如下所示:

// declare new type demo
typedef struct demo
{
    short low_pass_vcf;
    short filter_coupler;
    short reverb;
    short sequential;
} demo_t;

// define demo_t variable synth
demo_t synth;

更新2:

来自Linux kernel coding style

  

第5章:Typedef

     

请不要使用“vps_t”之类的内容。   使用typedef作为结构和指针是 错误。当你看到

vps_t a;
     

在源头,这是什么意思?   相反,如果它说

struct virtual_container *a;
     

你实际上可以说出“a”是什么。

答案 1 :(得分:3)

C typedef类型不需要struct关键字。它给你的唯一好处是它为类型创建一个单词的名称。

示例中的声明:

struct demo
{
    /* ... */
} synth;

实际上是两个声明,一个用于类型struct demo,另一个用于该类型的对象,名为synth。它可能更清楚地写成两个单独的声明:

struct demo
{
    /* ... */
};

struct demo synth;

第一个声明创建一个新的结构类型。它的名字是struct demo。第二个定义了该类型的对象,名为synth

鉴于这些声明,标识符demo本身是没有意义的;它是一个 struct标签,只有在struct关键字前面才有意义。

另一方面,

synth对象(变量)的名称。它不需要,实际上不能是struct关键字。

如果您愿意,可以添加typedef,为类型struct demo添加第二个名称。 (typedef没有定义新类型;它只是为现有类型定义新名称,别名。)例如,常见的习语是:

typedef struct demo {
    /* ... */
} demo;

与原始声明一样,这实际上是两个声明,struct定义创建类型struct demotypedef创建新名称demo类型。它可以写成:

struct demo {
    /* ... */
};
typedef struct demo demo;

如果您愿意,可以通过对象声明:

demo synth;

(请注意,不需要将struct标签和typedef名称区分开来,恕我直言,它们更清晰,因为它们是相同的。)

是否对结构类型使用typedef的选择主要是样式之一。我个人的偏好是使用typedef作为结构; struct demo已经有了一个非常好的名字。但是很多程序员喜欢使用一个单一标识符的名称。

答案 2 :(得分:0)

这与您声明的相同:

int i;

这样做了:

printf("Size of int: %i\n", sizeof(int));
printf("Size of int: %i\n", sizeof(i));

这两行会打印相同的值。

如果你有这个:

typedef struct demo
{
    short low_pass_vcf;
    short filter_coupler;
    short reverb;
    short sequential;
} mydemo;

mydemo synth;

你可以这样做:

printf("Size of struct: %i\n", sizeof(struct demo));
printf("Size of struct: %i\n", sizeof(mydemo));
printf("Size of struct: %i\n", sizeof(synth));

他们也会打印同样的东西。

答案 3 :(得分:0)

  

我可以通过struct data structure变量名访问synth;但是,在我看到的示例中,为了使我能够执行此操作,struct需要以typedef开头。

不,这不是你的想法。这不是因为typedef您可以使用synth访问结构成员。

  

在此示例中,未使用typedef,但我仍然可以通过synth引用此结构。

由于synth本身,因为它是struct variable,您可以访问struct的成员。

typedef是C语言中使用的关键字,用于为现有类型指定备用名称。大多数用于用户定义的数据类型。

一个例子 -

typedef struct A{
     char B;
     int C;
 }D ;

现在,D可用于声明struct变量。

没有typedef -

struct demo
{
   short low_pass_vcf;
   short filter_coupler;
   short reverb;
   short sequential;
}synth;

synth是一个struct变量,您可以访问struct的成员。但是在没有typedef的情况下,如果你想声明struct变量,你必须像这样声明 -

 struct demo t;

在任何一种情况下,如果您删除typedef,那么您也可以使用synth访问结构, typedef在此中没有任何作用。

答案 4 :(得分:0)

typedef关键字: 有一种更简单的方法来定义结构,或者您可以“创建”别名类型。例如:

typedef struct
{
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
}Books;

现在,您可以直接使用Books来定义Books类型的变量,而无需使用struct关键字。以下是示例:

Books Book1, Book2;

您可以对非结构使用typedef关键字,如下所示:

typedef long int *pint32;

pint32 x, y, z;

x,y和z都是指向长整数的指针