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

xzv2uavs  于 2023-10-16  发布在  其他
关注(0)|答案(5)|浏览(155)
#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;newDType是新的数据类型还是unsigned char的替代名称?

ny6fqffe

ny6fqffe1#

这一问题的明确答案在ISO C标准中。N1570是最新版本。第6.7.8节第3段指出:

**typedef**声明并不引入新类型,而只是引入所指定类型的同义词。

类似的措辞出现在所有以前版本的C标准中,至少可以追溯到1978年出版的Kernighan和里奇(K&R1)的第一版。

9nvpjoqh

9nvpjoqh2#

不,typedef为类型创建了别名,使用任何一个都是等效的。
报价cppreference
typedef声明提供了一种将标识符声明为类型别名的方法,用于替换可能复杂的类型名称
[...]
typedef声明不引入独特类型,它只为现有类型建立同义词
这是必不可少的,因为否则不透明类型-在接口中大量使用-将是不可能的。

1tu0hz3e

1tu0hz3e3#

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

dldeef67

dldeef674#

typedef specifier msdn page(* 点击了解更多
typedef声明引入了一个名称,该名称在其范围内成为声明的类型声明部分所给出的类型的同义词。
因此,如引号所引
*,新名称只是原始类型的替代名称**(* 同义词 *)。通常,typedef声明用于使声明更加统一和紧凑。

pxiryf3j

pxiryf3j5#

在相关头文件中:

typedef struct Vec3f{
    float x, y, z;
}Vec3f;

在相关的.c文件中:

Vec3f myVector;
myVector.x = 27.5f;
myVector.y = 2.0f;
myVector.z = 1.2f;

Vec3f my;
my.x = 7.5f;
my.y = 23.0f;
my.z = 12.2f;

SDL_Log("%f, %f, %f\n", myVector.x, myVector.y, myVector.z);
SDL_Log("%f, %f, %f\n", my.x, my.y, my.z);
SDL_Log("%f, %f, %f\n", myVector.x, myVector.y, myVector.z);

打印如预期。

相关问题