2010-02-07 5 views
18

typedef를 정적으로 사용할 수없는 이유는 무엇입니까? 예를 들어, 아래 코드는typedef를 정적으로 사용할 수없는 이유는 무엇입니까?

typedef static int INT2; 

다른 어떤 지배하는 형식 정의를 사용하기 위해 수행해야 오류가 무엇입니까? typedef에서 사용할 수없는 다른 키워드는 무엇입니까?

감사합니다.

+8

두 타입 정의와 정적 언어로 저장 클래스입니다 있습니다. 하나의 저장소 클래스 만 하나의 선언으로 만들 수 있습니다. 예를 들어 두 개가 있으므로 오류가 발생합니다. –

+3

+1. "typedef 지정자는 구문상의 편의를 위해서만"저장 클래스 지정자 "라고 불립니다." – dirkgently

답변

31

형식 정의가 예 변수의를 선언하지 않습니다, 그것은 유형 (실제로 형의 별칭),

static

하면 인스턴스가 아닌 유형에 적용되는 규정입니다 선언, 그래서 당신은 정적 사용할 수 있습니다 때 유형을 사용 ,하지만 당신은 유형을 정의 할 때. 당신이 그것을 사용할 수 있습니다 사방에 일관성이 있어야 결과 유형 typedef에를 선언 할 때이처럼 ..

typedef int int32; 
static int32 foo; 
+3

'static'은 한정자가 아니지만 * 저장소 클래스 지정자입니다. 따라서 const와 같은 한정어와 같은 "유형의 일부"가 아닙니다. 'typedef const int ci; ci x = 42;'(다른 수식어를 사용하는 형식은 여전히 ​​같은 형식이지만 호환되지 않을 수 있습니다). – dyp

+0

@ John Knoeller 우아한! 좋은 답변입니다! – Sohaib

20

static 키워드가 저장 또는 범위를 지정하며 유형에 아무런 영향을 미치지 않는다 문맥에 따라 형태의 일부가 아니다. 따라서 형식 정의의 일부로 사용할 수 없으므로 여기서 유효하지 않습니다.

typedef는 유형 정의입니다. 즉, 'this name'은 이제 'this type'을 말하고, 사용자가 제공하는 이름은 언어 표준에 정의 된 식별자 여야하며 유형은 유형이어야합니다 즉 const 또는 volatile과 같은 가능한 형식 지정자와 함께 이미 명명 된 형식, 기본 형식 또는 typedef 형식, 구조체, 공용체, 클래스 또는 열거 형 지정자를 포함 할 수 있습니다.

정적 키워드는하지만 유형을 변경하지 않습니다, 그것은 개체에 대한 것을 말한다 (안 OOP의 의미에서 일반을.) 예를 유형이 아닌 정적 저장 영역에 배치되는 변수입니다. 매크로로 형식 정의를 사용하려는 것 같습니다

, 즉

#define MYINT static int 
+1

왜 그렇게 중요한가요? –

+0

더글러스 애덤스 팬 : 나는 생각합니다. 아마도 베일리의 대답만큼이나 분명하지 않을 것입니다. 저장소 지정자와 범위 지정자는 * 유형 *의 일부가 아닙니다. 유형의 인스턴스가 저장되거나 범위가 지정되는 방식의 일부입니다. –

+0

@Robert 글쎄, 키워드가 말했듯이, 유형의 정의에 static을 사용할 수 없으면 static이 유형의 일부가 아니기 때문에 그것은 유형 디딤이다. – wich

7

저장 기간은 객체와 연결되어 있습니다. typedef 선언은 유형의 새 이름 인 별칭을 만듭니다. 객체를 만들지 않습니다. 따라서 typedef에 저장 지정자를 사용할 수 없습니다.

3

나는 느릅 나무와 베일리의 답변이 정확하고 충분하지만, 주석 그에게 분명히 도움 생각합니다. 당신이 만든 타입 정의는 다음 코드에 나타나는 경우 : INT2는 아무 의미가 없을 것입니다 반환

INT2 myfunction() 
{ 
    return 0; 
} 

class MyClass 
{ 
    public: INT2 x; 
}; 

INT2 MyClass::x; 
  • 기능. 물론 반환 값은 정적이 아닙니다.
  • MyClass에있는 X 부재 선언은 또한 나중에 정의 정적 및 것인가? 정적 멤버를 정의 할 때 정적 키워드를 사용하지 않기 때문에 (선언 할 때만) 정적 인 멤버를 사용하지 않기 때문에 중복이 아니라 부정확합니다.

동일 베일리 한 다른 키워드에 적용된다. 그것에 대해 생각해보십시오 : 모든 용도에 대해 유형을 일관되게 선언 할 수있는 유일한 키워드는 기본 유형 자체와 유형 수정 자 (const, unsigned 등)입니다. 다른 많은 사람들이 언급 한

3

, static는 스토리지 클래스 지정자 아닌 유형입니다.이게 무슨 뜻인지, 구체적으로는 static 키워드는 외부 링크, 또는 얼마나 오래 변수가 존재에 남아 있어야에 대한 상징으로 표시해야하는지 여부, 변수가 배치되어야 위치에 대한 컴파일러 뭔가를 알려줍니다 알 수 있다는 것입니다.

A 형은 메모리 위치의 해석이다. 해당 위치에서 어떤 종류의 데이터가 존재하는지에 대한 설명이며 해당 데이터에서 수행 할 수있는 일련의 작업과 관련됩니다.

은 그래서 유형 및 스토리지 클래스는 둘 다 데이터의 조각에 대해 뭔가를 말할 점에서 관련이 있습니다. typedef 키워드는 유형의 새 이름을 만드는 데 사용됩니다.

임의의 비유에 관해서는

...

유형은 특정 제조사 및 자동차 모델에 대해 얘기 같다.

스토리지 클래스는 자동차 전용 가열 차고에 저장 만 개인 경마장에 사용된다는 말과 같다.

타입 정의는 특정 제조사와 모델에 대한 별명이다.

2

typedeftypedefstatic 모두 같은 static와 함께 사용될 수 없다 스토리지 클래스이다. 변수를 typedef static int a;으로 정의하면 변수 a에 대해 여러 스토리지 클래스가 존재합니다.

스토리지 클래스 범위 (공개) 및 변수들 및/또는 기능의 수명 시간을 정의하기 위해 사용된다. (C에 대한 엄격 사실, 나는 ++은 C에 대한도 마찬가지입니다 생각) 몇 가지 예는 static, auto, register, extern, typedef

+0

이것은 흥미 롭습니다! 실제로 'typedef'는 "구문상의 편의를 위해서"6.7.1/3이지만 * 저장 클래스 지정자 *로 지정됩니다. – dyp

+0

조나단 레 플러 (Jonathan Leffler)는 [OP에 대한 의견] (http://stackoverflow.com/questions/2218435/why-typedef-can-not-be-used-with-static#comment2172109_2218435)에서 이와 비슷한 내용을 말했습니다. – dyp

관련 문제