>  기사  >  백엔드 개발  >  C 언어에서 typedef의 용도는 무엇입니까?

C 언어에서 typedef의 용도는 무엇입니까?

青灯夜游
青灯夜游원래의
2020-07-18 14:23:2934608검색

typedef의 사용법은 다음과 같습니다. 1. 기본 데이터 유형에 대한 새 유형 이름을 정의합니다. 2. 사용자 정의 데이터 유형(구조, 공용체 및 열거 유형)에 대한 간결한 유형 이름을 정의합니다. 3. 유형 이름에 대한 간결한 유형 이름을 정의합니다. 4. 포인터의 간결한 이름을 정의합니다.

C 언어에서 typedef의 용도는 무엇입니까?

C 언어를 사용하면 사용자는 typedef 키워드를 사용하여 시스템의 기본 기본 유형 이름, 배열 유형 이름, 포인터 유형 이름, 사용자 정의 구조 유형 이름 및 공유 유형을 대체하는 사용자 정의 데이터 유형 이름을 정의할 수 있습니다. 이름, 열거 이름 등

사용자가 프로그램에서 자신의 데이터 유형 이름을 정의하면 자신의 데이터 유형 이름을 사용하여 프로그램에서 변수 유형, 배열 유형, 포인터 변수 유형, 함수 유형 등을 정의할 수 있습니다.

예를 들어 C 언어는 C99 이전에는 Boolean 유형을 제공하지 않았지만 다음 코드와 같이 typedef 키워드를 사용하여 간단한 Boolean 유형을 정의할 수 있습니다.

typedef int BOOL;
#define TRUE 1
#define FALSE 0

정의한 후 기본 유형을 사용할 수 있습니다. type like 다음 코드와 같이 데이터처럼 사용하세요.

BOOL bflag=TRUE;

typedef를 사용하는 4가지 방법

실제 사용에서 typedef의 주요 용도는 다음과 같습니다.

1. 기본 데이터 유형에 대한 새 유형 이름 정의

즉, 모든 시스템의 기본 기본 유형은 typedef 키워드를 사용하여 유형 이름을 재정의할 수 있습니다.

typedef unsigned int COUNT;

게다가, 또한 이 접근 방식을 사용하여 플랫폼 독립적인 유형을 정의할 수도 있습니다. 예를 들어 REAL이라는 부동 소수점 유형을 정의하려는 경우 대상 플랫폼 1에서 가장 높은 정밀도 유형을 나타내도록 합니다. 즉,

typedef long double REAL;

long double을 지원하지 않는 플랫폼 2에서는 다음과 같이 변경합니다.

typedef double REAL;

그래도 괜찮습니다. double도 지원하지 않는 플랫폼 3에서는 다음과 같이 변경합니다.

typedef float REAL;

이런 식으로 여러 플랫폼에 걸쳐 프로그램을 이식할 때 typedef의 정의만 수정하면 됩니다. 다른 소스 코드. 실제로 이 기술은 표준 라이브러리에서 널리 사용됩니다. 예를 들어 VC++2010의 crtdefs.h 파일에 있는 size_t의 정의는 다음과 같습니다.

#ifndef _SIZE_T_DEFINED
#ifdef  _WIN64
typedef unsigned __int64    size_t;
#else
typedef _W64 unsigned int   size_t;
#endif
#define _SIZE_T_DEFINED
#endif

2. 열거형) (예제 유형) 간결한 유형 이름 정의

구조를 예로 들어 아래에서는 Point라는 구조를 정의합니다.

struct Point
{
    double x;
    double y;
    double z;
};

이 구조를 호출할 때 다음 코드와 같이 이 구조를 호출해야 합니다.

struct Point oPoint1={100,100,0};
struct Point oPoint2;

여기서 struct Point라는 구조체는 변수를 정의할 때 위의 호출 메소드처럼 struct 예약어를 사용해야 하는 새로운 데이터 유형입니다. Point는 int 및 double과 같은 변수를 정의하는 데 직접 사용할 수 없습니다. 이제 다음 코드와 같이 typedef를 사용하여 이 구조를 정의합니다.

typedef struct tagPoint
{
    double x;
    double y;
    double z;
} Point;

위 코드에서는 실제로 두 가지 작업이 완료됩니다.

1) 새 구조 유형을 정의합니다. 코드는 다음과 같습니다. 표현:

struct tagPoint
{
    double x;
    double y;
    double z;
} ;

그 중 struct 키워드와 tagPoint가 함께 이 구조 유형을 구성합니다. 이 구조는 typedef 키워드의 존재 여부와 관계없이 존재합니다.

2) typedef를 사용하여 이 새 구조에 Point라는 별칭을 지정합니다. 즉:

typedef struct tagPoint Point

따라서 이제 다음 코드에 표시된 대로 Point를 직접 사용하여 int 및 double과 같은 변수를 정의할 수 있습니다.

Point oPoint1={100,100,0};
Point oPoint2;

순서 typedef에 대한 이해를 깊게 하기 위해 다음 코드와 같이 구조체의 예를 살펴보겠습니다.

typedef struct tagNode
{
    char *pItem;
    pNode pNext;
} *pNode;

위의 예제 코드는 표면적으로는 이전 정의 방법과 동일하므로 문제가 없을 것입니다. 그런데 컴파일러가 오류를 보고했습니다. 왜 그럴까요? C 언어에서는 구조체가 자신에 대한 포인터를 포함하는 것을 허용하지 않을 수 있습니까?

사실 문제는 구조체 자체의 정의가 아닙니다. C 언어에서는 구조체에 자신에 대한 포인터를 포함할 수 있다는 점을 모두가 알아야 합니다. 연결 목록과 같은 데이터 구조 구현에서 이러한 예를 많이 볼 수 있습니다. 그렇다면 문제는 무엇입니까? 사실 근본적인 문제는 여전히 typedef의 적용에 있습니다.

위 코드에서 pNext 선언은 새 구조를 설정하는 동안 발견되며 해당 유형은 pNode입니다. 여기서 pNode가 구조의 새로운 별칭을 나타낸다는 점에 유의하는 것이 중요합니다. 그래서 문제가 발생합니다. 구조 유형 자체가 생성되지 않은 경우 컴파일러는 이 구조 유형의 새 별명이 아직 존재하지 않기 때문에 pNode를 전혀 알지 못하므로 자연스럽게 오류를 보고하게 됩니다. 따라서 다음 코드와 같이 구조의 pNext 선언을

typedef struct tagNode
{
    char *pItem;
    struct tagNode *pNext;
} *pNode;

로 수정하거나 struct와 typedef를 별도로 정의하는 등 몇 가지 적절한 조정이 필요합니다.

typedef struct tagNode *pNode;
struct tagNode
{
    char *pItem;
    pNode pNext;
};

위 코드에서 우리는 또한 다음을 사용합니다. 완전히 선언되지 않은 tagNode 유형에 새로운 별칭을 제공하는 typedef입니다. 그러나 이 방법은 C 컴파일러에서 완전히 지원되지만 권장되지는 않습니다. 다음 표준 정의 방법을 사용하는 것이 좋습니다.

struct tagNode
{
    char *pItem;
    struct tagNode *pNext;
};
typedef struct tagNode *pNode;

3、为数组定义简洁的类型名称

它的定义方法很简单,与为基本数据类型定义新的别名方法一样,示例代码如下所示:

typedef int INT_ARRAY_100[100];
INT_ARRAY_100 arr;

4、为指针定义简洁的名称

对于指针,我们同样可以使用下面的方式来定义一个新的别名:

typedef char* PCHAR;
PCHAR pa;

对于上面这种简单的变量声明,使用 typedef 来定义一个新的别名或许会感觉意义不大,但在比较复杂的变量声明中,typedef 的优势马上就体现出来了,如下面的示例代码所示:

int *(*a[5])(int,char*);

对于上面变量的声明,如果我们使用 typdef 来给它定义一个别名,这会非常有意义,如下面的代码所示:

// PFun是我们创建的一个类型别名
typedef int *(*PFun)(int,char*);
// 使用定义的新类型来声明对象,等价于int*(*a[5])(int,char*);
PFun a[5];

小心使用 typedef 带来的陷阱

接下来看一个简单的 typedef 使用示例,如下面的代码所示:

typedef char* PCHAR;
int strcmp(const PCHAR,const PCHAR);

在上面的代码中,“const PCHAR” 是否相当于 “const char*” 呢?

答案是否定的,原因很简单,typedef 是用来定义一种类型的新别名的,它不同于宏,不是简单的字符串替换。因此,“const PCHAR”中的 const 给予了整个指针本身常量性,也就是形成了常量指针“char*const(一个指向char的常量指针)”。即它实际上相当于“char*const”,而不是“const char*(指向常量 char 的指针)”。当然,要想让 const PCHAR 相当于 const char* 也很容易,如下面的代码所示:

typedef const char* PCHAR;
int strcmp(PCHAR, PCHAR);

其实,无论什么时候,只要为指针声明 typedef,那么就应该在最终的 typedef 名称中加一个 const,以使得该指针本身是常量。

还需要特别注意的是,虽然 typedef 并不真正影响对象的存储特性,但在语法上它还是一个存储类的关键字,就像 auto、extern、static 和 register 等关键字一样。因此,像下面这种声明方式是不可行的:

typedef static int INT_STATIC;

不可行的原因是不能声明多个存储类关键字,由于 typedef 已经占据了存储类关键字的位置,因此,在 typedef 声明中就不能够再使用 static 或任何其他存储类关键字了。当然,编译器也会报错,如在 VC++2010 中的报错信息为“无法指定多个存储类”。

相关推荐:《c语言教程

위 내용은 C 언어에서 typedef의 용도는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.