typedef의 사용법은 다음과 같습니다. 1. 기본 데이터 유형에 대한 새 유형 이름을 정의합니다. 2. 사용자 정의 데이터 유형(구조, 공용체 및 열거 유형)에 대한 간결한 유형 이름을 정의합니다. 3. 유형 이름에 대한 간결한 유형 이름을 정의합니다. 4. 포인터의 간결한 이름을 정의합니다.
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!