programing

"typedef"는 유형과 에일리어스 사이에 표준 적합성이 있습니까?

luckcodes 2022. 8. 11. 22:14

"typedef"는 유형과 에일리어스 사이에 표준 적합성이 있습니까?

우연히 어떤 코드를 발견했는데typedef키워드는 에서와 같이 타입과 에일리어스 이름 사이에 있습니다.

int typedef INT;

gcc 및 clang으로 컴파일됩니다(실시간 예).나는 표준어를 잘 이해하지 못한다.그래서 제가 묻고 싶은 것은 이것이 표준규격에 적합한가?컴파일러에 의한 지원도 가능합니까?

typedef키워드는 C에서 스토리지 클래스 지정자로 분류되지만 표준에서는 형식 언어 구문을 표현하는 데 편리하다고 명시되어 있습니다.그럼에도 불구하고 그 뒤를 잇는다typedef다음과 같은 다른 스토리지 클래스 지정자와 동일한 위치에 표시할 수 있습니다.extern또는static가 표시될 수 있습니다.[C2011, 6.7.1/5]

실제로 이 구문을 사용하면 선언에서 스토리지 클래스 지정자를 유형 지정자, 유형 한정자 및 기타 "선언 지정자"와 함께 사용할 수 있습니다.[C2011, 6.7/1, 6.7/6]

따라서, 네, 이 명령어를 붙이는 것은 유효합니다.typedef키워드 뒤에 입력합니다(예시 참조).

TL/DR 버전

네.int typedef INT일치하고 있습니다.

제임스 미치너 버전

C 선언 구문(C 2011 온라인 초안):

6.7 선언

구문

1     declaration:
         declaration-specifiers init-declarator-listopt ;
         static_assert-declaration

     declaration-specifiers:
         storage-class-specifier declaration-specifiersopt
         type-specifier declaration-specifiersopt
         type-qualifier declaration-specifiersopt
         function-specifier declaration-specifiersopt
         alignment-specifier declaration-specifiersopt
...

즉, 단일 선언에서 하나 이상의 선언 지정자를 사용할 수 있습니다. 여기서 각 선언 지정자는 스토리지 클래스 지정자( )가 될 수 있습니다.auto,extern,static,typedef타입 지정자( )int,float,char, 등), 타입 한정자(const,restrict,volatile, 등), 함수 지정자(inline또는 정렬 지정자를 지정합니다.

다양한 지정자가 나타나는 순서는 중요하지 않습니다.static const short int x;라고 쓸 수 있다int static short const x, 또는int short const static x, 등. 대부분의 사람들은 스토리지 클래스 지정자를 먼저 배치하고, 그 다음에 함수 또는 정렬 지정자(필요한 경우), 그 다음에 유형 한정자, 유형 지정자를 차례로 배치하므로,static const short int x대부분의 사람들이 그 선언문을 어떻게 쓰느냐가 문제죠

이 구문을 통해 다음과 같은 유형을 작성할 수 있습니다.long double또는long long또는unsigned long int,기타.

구문은 임의(임의로 긴) 유형 지정자 시퀀스를 허용하지만, 상대적인 몇 개만 허용하는 의미 규칙이 있습니다.글씨를 쓸 수 없다short short short short x예를 들어, 또는long long long double y. 다음 시퀀스만 허용됩니다.

제약

2 각 선언의 선언 지정자 및 각 구조 선언 및 형식 이름의 지정자 한정자 리스트에 적어도 하나의 형식 지정자를 부여해야 한다.유형 지정자의 각 목록은 다음 다중 집합 중 하나여야 합니다(항목당 여러 개의 다중 집합이 있는 경우 쉼표로 구분). 유형 지정자는 임의의 순서로 발생할 수 있으며 다른 선언 지정자와 혼합될 수 있습니다.
--void
--char
--signed char
--unsigned char
--short, signed short, short int, or signed short int
--unsigned short, or unsigned short int
--int, signed, or signed int
--unsigned, or unsigned int
--long, signed long, long int, or signed long int
--unsigned long, or unsigned long int
--long long, signed long long, long long int, or
             signed long long int
--unsigned long long, or unsigned long long int
--float
--double
--long double
--_Bool
--float _Complex
--double _Complex
--long double _Complex
: atomic " " "
: structure '유니온'
: " 형 : 「 」
: typedef 이름

부록

한 바와 , 향후 으로 스토리지 될 수 .따라서 Keith는 다음과 같습니다.int typedef INT는 미래의 컴파일러에서는 합법적이지 않을 수 있습니다.

.1 7.1/1에 .decl-specifier: A는 다음과 .type-specifiertypedef키워드는 문법의 같은 포인트에 있기 때문에, 질문에서와 같이 그것들을 교환할 수 있습니다(단, 이와 같이 코드를 쓰는 것은 전혀 관용적이지 않습니다).

decl-specifier:

storage-class-specifier

type-specifier

function-specifier

friend

typedef

컴파일 방법:

gcc - c - Wall - Wextra - pedantic - Wconversion - std = 182499

은 '우리'를 의미합니다.-Wold-style-declaration설정되었습니다.

그러면 컴파일러는 다음 경고 메시지를 출력합니다.

warning: 'typedef' is not a beginning of declaration [-Wold-style-declaration]

이 파라미터를 설정하지 않으면 컴파일러는 문제없이 구문을 처리합니다.

따라서 게시된 구문은 표준 범위 내에 있지만 독자에게 혼란을 줄 수 있습니다.

typedef int INT

typedef를 사용하는 RightWay

INT를 사용하는 곳이라면 어디서든 int 데이터 타입으로 대체됩니다.

이 주요 목적은 단순한 값으로 긴 데이터 문자열에 대해서만 사용되지만 이 경우 일반 int 자체를 사용할 수 있습니다.

테스트용으로만 릴레이 할 수 있습니다.디버깅을 사용하면 충분히 이해할 수 있습니다.

언급URL : https://stackoverflow.com/questions/35228738/is-typedef-in-between-the-type-and-the-alias-standard-conformant