C 언어에서 typedef의 용도는 무엇입니까?
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











C 언어 데이터 구조 : 트리 및 그래프의 데이터 표현은 노드로 구성된 계층 적 데이터 구조입니다. 각 노드에는 데이터 요소와 하위 노드에 대한 포인터가 포함되어 있습니다. 이진 트리는 특별한 유형의 트리입니다. 각 노드에는 최대 두 개의 자식 노드가 있습니다. 데이터는 structtreenode {intdata; structtreenode*왼쪽; structReenode*오른쪽;}을 나타냅니다. 작업은 트리 트래버스 트리 (사전 조정, 인 순서 및 나중에 순서) 검색 트리 삽입 노드 삭제 노드 그래프는 요소가 정점 인 데이터 구조 모음이며 이웃을 나타내는 오른쪽 또는 무의미한 데이터로 모서리를 통해 연결할 수 있습니다.

파일 작동 문제에 대한 진실 : 파일 개방이 실패 : 불충분 한 권한, 잘못된 경로 및 파일이 점유 된 파일. 데이터 쓰기 실패 : 버퍼가 가득 차고 파일을 쓸 수 없으며 디스크 공간이 불충분합니다. 기타 FAQ : 파일이 느리게 이동, 잘못된 텍스트 파일 인코딩 및 이진 파일 읽기 오류.

C 언어 멀티 스레딩 프로그래밍 안내서 : 스레드 생성 : pthread_create () 함수를 사용하여 스레드 ID, 속성 및 스레드 함수를 지정합니다. 스레드 동기화 : 뮤텍스, 세마포어 및 조건부 변수를 통한 데이터 경쟁 방지. 실제 사례 : 멀티 스레딩을 사용하여 Fibonacci 번호를 계산하고 여러 스레드에 작업을 할당하고 결과를 동기화하십시오. 문제 해결 : 프로그램 충돌, 스레드 정지 응답 및 성능 병목 현상과 같은 문제를 해결합니다.

알고리즘은 문제를 해결하기위한 일련의 지침이며 실행 속도 및 메모리 사용량은 다양합니다. 프로그래밍에서 많은 알고리즘은 데이터 검색 및 정렬을 기반으로합니다. 이 기사에서는 여러 데이터 검색 및 정렬 알고리즘을 소개합니다. 선형 검색은 배열 [20,500,10,5,100,1,50]이 있으며 숫자 50을 찾아야한다고 가정합니다. 선형 검색 알고리즘은 대상 값이 발견되거나 전체 배열이 통과 될 때까지 배열의 각 요소를 하나씩 점검합니다. 알고리즘 플로우 차트는 다음과 같습니다. 선형 검색의 의사 코드는 다음과 같습니다. 각 요소를 확인하십시오. 대상 값이 발견되는 경우 : true return false clanue 구현 : #includeintmain (void) {i 포함

C에서 카운트 다운을 출력하는 방법? 답변 : 루프 명령문을 사용하십시오. 단계 : 1. 변수 n을 정의하고 카운트 다운 번호를 출력에 저장합니다. 2. n이 1보다 작을 때까지 n을 지속적으로 인쇄하려면 while 루프를 사용하십시오. 3. 루프 본체에서 n의 값을 인쇄하십시오. 4. 루프가 끝나면 n을 1 씩 빼기 위해 다음 작은 상호 상호를 출력합니다.

C 언어 데이터 구조 : 인공 지능 분야에서 데이터 구조의 주요 역할 개요 인공 지능 분야에서 데이터 구조는 다량의 데이터를 처리하는 데 중요합니다. 데이터 구조는 데이터를 구성하고 관리하고 알고리즘을 최적화하며 프로그램 효율성을 향상시키는 효과적인 방법을 제공합니다. 공통 데이터 구조는 일반적으로 C 언어로 사용되는 데이터 구조에는 다음이 포함됩니다. 배열 : 동일한 유형의 연속 저장된 데이터 항목 세트. 구조 : 다양한 유형의 데이터를 함께 구성하고 이름을 제공하는 데이터 유형. 링크 된 목록 : 데이터 항목이 포인터로 함께 연결되는 선형 데이터 구조. 스택 : 최후의 첫 번째 (LIFO) 원칙을 따르는 데이터 구조. 대기열 : 첫 번째 첫 번째 (FIFO) 원칙을 따르는 데이터 구조. 실제 사례 : 그래프 이론의 인접 테이블은 인공 지능입니다.

C 언어 함수는 재사용 가능한 코드 블록이며 처리를위한 매개 변수를 수신하며 결과를 반환합니다. 스위스 육군 나이프와 유사하며 강력하며 신중하게 사용해야합니다. 함수에는 형식 정의, 매개 변수, 반환 값 및 기능 본체와 같은 요소가 포함됩니다. 고급 사용법에는 기능 포인터, 재귀 함수 및 콜백 기능이 포함됩니다. 일반적인 오류는 유형 불일치이며 프로토 타입을 선언하는 것을 잊는 것입니다. 디버깅 기술에는 변수 인쇄 및 디버거 사용이 포함됩니다. 성능 최적화는 인라인 함수를 사용합니다. 기능 설계는 단일 책임의 원칙을 따라야합니다. C 언어 기능의 숙련도는 프로그래밍 효율성과 코드 품질을 크게 향상시킬 수 있습니다.

C 언어 처리 파일에 대한 팁 문제 해결 C 언어로 파일을 처리 할 때 다양한 문제가 발생할 수 있습니다. 다음은 일반적인 문제와 해당 솔루션입니다. 문제 1 : 파일 코드를 열 수 없음 : 파일*fp = fopen ( "myfile.txt", "r"); if (fp == null) {// 파일 열기 실패} 이유 : 파일 경로 오류 파일이 존재하지 않으면 파일을 확인하여 파일에 실패한 문제 : 파일 읽기 문제 2 : 코드를 확인하십시오. charbuffer [100]; size_tread_bytes = fread (버퍼, 1, siz
