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

问题描述 投票:0回答:5
#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
的替代名称?

c types typedef
5个回答
8
投票

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

A

typedef
声明并没有引入新类型,只是引入了一个 指定类型的同义词。

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


4
投票

不,

typedef
为类型创建别名,并且使用其中任何一个实际上都等效。

引用cppreference

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

这是必要发生的,因为否则不透明类型(在接口中大量使用)是不可能的。


3
投票

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


2
投票

来自

typedef
说明符 msdn 页面单击了解更多

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


因此,正如所引用的新名称只是原始类型的替代名称同义词)。一般来说,使用

typedef
声明可以使声明更加统一和紧凑。


0
投票

相关头文件中:

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);

按预期打印。

© www.soinside.com 2019 - 2024. All rights reserved.