typedef-name은 typedef 선언에서 선택 사항입니까?
저는 g++-4에서 오류나 경고 없이 다음 코드를 컴파일하는 것을 보고 상당히 놀랐습니다.2:
typedef enum test { one };
제 추측은 만약 당신이 그것을 사용한다면typedef
키워드는 다음과 같이 추가 식별자가 필요합니다.
typedef enum test { one } test;
이미 언급했듯이 g++-4.2는 경고도 없이 이를 받아들입니다.Clang++ 3.0은 "warning: typedef required"를 경고하고, 마찬가지로 Comeau는 "warning: declaration requiredef"를 경고하며, g++-4.6은 "warning: 'typedef'는 이 선언에서 무시되었습니다."라고 알려줍니다.
나는 이것이 표준에서 어디에서 허용되는지 확인할 수 없었고, 컴파일러 중 두 명이 그것이 필요하다고 경고하는 것이 약간 혼란스럽다, 만약 typeef-name이 필요하지만 존재하지 않는다면 그것은 오류가 되어야 하는 것이 아닌가요?
업데이트: 동일한 컴파일러로 C에 체크인했습니다.clang과 comeau는 동일한 출력을 생성하고 gcc는 "warning: 빈 선언의 쓸모없는 스토리지 클래스 지정자"라는 경고를 제공하며, 이는 더욱 혼란스러워 보입니다.
업데이트: 열거 이름을 제거하는 것을 확인했으며 결과는 동일합니다.
typedef enum { one };
명명된 구조체의 경우도 마찬가지입니다.
typedef struct named { int x };
그러나 g++(4.2/4.6)에서 "error: missing type-name in type ef-declaration"으로 코드가 거부된 경우 gcc(4.2/4.6)는 "warning: no instance를 정의하는 named structure/union", clang++ "warning: declaration은 아무것도 선언하지 않음", comeau "error: declaration은 typeed ef name"을 요구합니다.
이 구문은 허용되지만 이점을 제공하지 않는 퇴보 구문입니다.대부분의 최신 컴파일러는 이에 대한 경고를 표시하도록 자극받을 수 있지만 기본적으로 그렇지 않을 수 있습니다.typedef name을 지정하지 않으면 키워드가typedef
는 불필요합니다. 이 예에서는 다음과 완전히 동일합니다.
enum test { one };
이러한 현상이 발생할 수 있는 또 다른 장소는 다음과 같은 구조입니다.
typedef struct SomeThing { int whatever; };
이는 다음과 같습니다.
struct SomeThing { int whatever; };
참고:typedef
공식적으로(또는 구문적으로) 다음과 같은 '스토리지 클래스 지정자'입니다.static
,extern
,auto
그리고.register
.
C 표준
ISO/IEC 9899:1999(이것이 C 표준)에서 우리는 다음을 발견합니다.
◦6.7 선언
구문
선언:
선언-지정자opt init-remicator-list;
선언 지정자:
저장소 클래스 지정자 선언 지정자선택의
형식 지정자 선언 지정자선택의
활자 인쇄의 선언 지정자선택의
함수 지정자 선언 지정자선택의
init-reminator-list:
init-creator
init-reminator-list, init-reminator
init-creator:
선언자
선언자 = 이니셜라이저
그리고 (요청대로):
◦6.7.1 스토리지 등급 지정자
구문
스토리지 클래스 지정자:
typedef
extern
static
auto
register
그 구문을 통해 추적해 보면, 많은 퇴화 가능성이 있습니다. 그리고 여러분이 보여준 것은 그 중 하나에 불과합니다.
C++ 표준
C++에 다른 규칙이 있을 수 있습니다.
C1 ' 지정자에서 C++가 ISO/IEC 14882:1998을 처리하지 것을 했습니다.에서는 C++가 처리하지 않는 § 7.1.1 '스토리지 클래스 지정자'를 발견했습니다.typedef
로, 에 스리지클로, 목이추니다가 추가됩니다.mutable
및외를 제외합니다.typedef
그서래, 인적사은의 인 사양.typedef
C++에서 C 사양과 확실히 다릅니다.
◦7 선언문
선언은 이름 해석 방법을 지정합니다.선언은 형식을 가집니다.
선언-seq:
"선-seq"
선언:
변환
정의
설명
은 다음과 같습니다.
전문화를 위한 것입니다.
연동-규격
파일 이름
블록 계산:
설명
use-production ▁using-
단순 계산:
decl-specifier-seqopt init-creator-listopt;
...
가 5 decl-specifier-seq를
typedef
은 정지자, 선라고은불다립니언라고 .typedef
과 각 언문과각이의init-declarator
는 typeef-name으로 선언되며, 관련 형식(7.1.3)과 동의어입니다.◦7.1 지정자 [dcl.spec]
선언에 사용할 수 있는 지정자는 다음과 같습니다.
decl-specifier:
명령어
형식 지정
function-specifier
friend
typedef
decl-specifier-seq:
decl-specifier-seqopt
지정
◦7.1.1 저장소 클래스 지정자 [dcl.stc]
스토리지 클래스 지정자:
auto
register
static
extern
mutable
◦7.1.2 기능 지정자 [dcl.fct.spec]
함수 지정자:
inline
virtual
explicit
◦7.1.3 형식 정의 지정자 [dcl.typeef]
decl-specifier를
typedef
나중에 기본(3.9.1) 또는 복합(3.9.2) 유형을 명명하는 데 사용할 수 있는 식별자를 선언합니다.typedef
지정자는 함수 정의(8.4)에서 사용할 수 없으며, 형식 지정자를 제외한 다른 종류의 지정자와 결합해서는 안 됩니다.def-name 입력:
...
지정된 범위에서 typedef 지정자를 사용하여 해당 범위에서 선언된 형식의 이름을 재정의하여 이미 참조하는 형식을 참조할 수 있습니다.[예:
typedef struct s { /* ... */ } s; typedef int I; typedef int I; typedef I I;
—끝 예제]
◦7.1.4 친구 지정자 [dcl.friend]
친구 지정자는 클래스 구성원에 대한 액세스를 지정하는 데 사용됩니다. 11.4를 참조하십시오.
◦7.1.5 형식 지정자 [dcl.type]
형식 지정자:
simple-type-specifier
class-specifier
명령어
유형 지정자
cv-cv-cv-cv 매개 변수
75파운드라고 .typedef
이름은 init-declarator에서 나오고 init-declarator-list는 'opt' 태그가 지정되어 있습니다. 제 생각에는 그것이 의미하는 것 같습니다.typedef
C++에서도 C에서와 마찬가지로 이름을 생략할 수 있습니다.
C++03에서 수 과 같습니다.§7.1.3 [dcl.typedef] p1
:
def-name 입력:
- 식별자
으로
typedef
지정자가 형식 def-name이 됩니다.
after 식별자가 누락된 것을 주의하십시오. 이는 적어도 내게 typeef-name에 식별자가 필요하다는 것을 나타냅니다.테스트된 모든 컴파일러가 (조용히) 이것을 수락한다는 것이 이상합니다.
편집 : @Jonathan님의 답변 후 위와 동일한 기준으로 다음과 같은 내용을 확인하였습니다.
decl-specifier:
- 저장소 클래스 지정자
- 형식 지정자
- 함수 지정자
friend
typedef
보다시피, 그것은 추가적인 사례를 제공합니다.typedef
스토리지 클래스 지정자 목록을 보면 다음과 같은 이점이 있습니다.
스토리지 클래스 지정자:
auto
register
static
extern
mutable
그래서, 우리는 C++ 사건에서 전과 마찬가지로 아무것도 모릅니다.
진짜 C 대 C로 보여요.C++ 차이, 나한테는.C++는 암묵적으로 defstruct와 union을 태그에 입력합니다. 따라서 typeef를 추가하는 것은 불필요하지만 오류는 아닙니다.이것이 열거형에도 효과가 있는지 모르겠습니다.
다음으로 수행할 작업은 이러한 선언 후에 허용되는 변수 정의를 확인하는 것입니다.
enum test etest;
test etest2;
struct named snamed;
named snamed2;
언급URL : https://stackoverflow.com/questions/6399898/is-the-typedef-name-optional-in-a-typedef-declaration
'programing' 카테고리의 다른 글
MySqlTuner - 실패: 반환 코드 256 (0) | 2023.09.03 |
---|---|
jQuery에서 "this" 내부의 요소를 선택하는 방법은 무엇입니까? (0) | 2023.09.03 |
MySQL에서 Java/Hibernate에서 BigDecimal을 어떤 유형으로 매핑하시겠습니까? (0) | 2023.09.03 |
그룹 값은 0까지 SQL(maria DB)에 시간을 기준으로 저장하고 카운트와 함께 합계를 수행합니다. (0) | 2023.09.03 |
UIColor를 CGColor로 신속하게 변환 (0) | 2023.09.03 |