当在C中使用typedef时,它会创建一个新类型还是只创建一个类型名称?

时间:2016-11-11 19:48:47

标签: c types typedef

#include <stdio.h>
#include <string.h>

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

int main( ) {

  Book book;

  strcpy( book.title, "C Programming");
  strcpy( book.author, "Nuha Ali"); 
  strcpy( book.subject, "C Programming Tutorial");
  book.book_id = 6495407;

  printf( "Book title : %s\n", book.title);
  printf( "Book author : %s\n", book.author);
  printf( "Book subject : %s\n", book.subject);
  printf( "Book book_id : %d\n", book.book_id);

  return 0;
}
  

在这个例子中,Book是一个新的数据类型或它只是一个结构的替代名称?

或换句话说,如果代码是:typedef unsigned char newDType; newDTypeunsigned char的新数据类型或替代名称?

4 个答案:

答案 0 :(得分:6)

对此的明确答案是ISO C标准。 N1570是最新的草案。第6.7.8节第3段说:

  

typedef 声明不会引入新类型,只会引入一个   所指定类型的同义词。

类似的措辞出现在C标准的所有先前版本中,并且至少回溯到1978年出版的第一版Kernighan和Ritchie(K&amp; R1)。

答案 1 :(得分:3)

如果我们在谈论比较编程语言,则typedef不会创建新类型。它有效地为类型创建别名。

答案 2 :(得分:3)

不,typedef为类型创建别名,并且使用它们实际上等效。

引用cppreference

  

typedef声明提供了一种将标识符声明为类型别名的方法,用于替换可能复杂的类型名称
  [...]
  typedef声明不引入不同的类型,它只为现有类型

建立同义词

它是必需的,因为否则不可能在接口中使用不透明的类型。

答案 3 :(得分:1)

typedef specifier msdn page点击了解更多

  

typedef声明引入一个名称,该名称在其范围内成为声明的类型声明部分给出的类型的同义词。

因此,引用新名称只是原始类型的替代名称同义词)。通常,typedef声明用于使声明更加统一和紧凑。