programing

typedef-name은 typedef 선언에서 선택 사항입니까?

closeapi 2023. 9. 3. 16:18
반응형

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그서래, 인적사은의 인 사양.typedefC++에서 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' 태그가 지정되어 있습니다. 제 생각에는 그것이 의미하는 것 같습니다.typedefC++에서도 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

반응형