클래스 선언 중괄호 뒤의 세미콜론


82

C ++ 클래스에서 닫는 중괄호 뒤에 세미콜론이있는 이유는 무엇입니까? 나는 정기적으로 그것을 잊어 버리고 컴파일러 오류가 발생하여 시간을 낭비합니다. 나에게는 다소 불필요한 것처럼 보이지만 그럴 것 같지 않습니다. 사람들이 정말로 다음과 같은 일을합니까?

class MyClass
{
.
.
.
} MyInstance;

구조체와 열거 형에 대한 C 호환성 관점에서 얻었지만 클래스는 C 언어의 일부가 아니기 때문에 주로 비슷한 선언 구문 사이의 일관성 유지에 있다고 생각합니다.

내가 찾던 것은 무엇이든 변경할 수있는 것보다 디자인 근거와 더 관련이 있었지만, 좋은 코드 완성 IDE는 컴파일 전에 이것을 트랩 할 수 있습니다.


4
도움이 될 수 있습니다 : cpptalk.net/…
Michael Haren

@Michael, 링크 주셔서 감사합니다. 역사적 관점에서 볼 때 이는 의미가 있으며 C ++가 모든 C 문법을 허용하고 C ++ 클래스가 구조체와 동의어 인 경우 클래스 끝에 필요한 세미콜론이 남습니다.
SmacL 2009

3
@Brian, 그래 심각한 질문입니다. 나는 그것과 함께 살아야한다는 것을 잘 알고 있지만 디자인과 구현의 근거가 궁금합니다.
SmacL 2009

좋습니다.하지만 원하는 디자인 근거를 포함하도록 질문을 편집해야합니다. 그대로, 사람들이 "왜 중괄호가 필요한가"와 같은 질문을하도록 장려합니다. :) Stroustrup의 Design & Evolution of C ++를 읽는 데 관심이있을 수 있지만, 수업이 끝날 때 세미콜론보다 더 중요한 문제를 다루고 있습니다.
Brian Neal

@Brian, 충분히 공평했으며 위키 여부에 대한 경계선이었습니다. 이 질문은 대규모 빌드에서 정기적으로 사용되는 헤더에 세미콜론을 생략 한 후 요청되었습니다. 30 분의 비용이 들었으므로 SO를 방문했습니다. 귀하의 제안에 따라 질문이 수정되었습니다.
SmacL 2009

답변:


47

유형 선언에서 닫는 중괄호 뒤의 세미콜론은 언어에 필요합니다. C의 초기 버전 이후로 그렇게되었습니다.

그리고 예, 사람들은 실제로 당신이 거기에 올린 선언을합니다. 메서드 내에서 범위가 지정된 유형을 만드는 데 유용합니다.

void Example() {
  struct { int x; } s1;
  s1.x = 42;

  struct ADifferentType { int x; };
}

이 경우 세미콜론이 필요한 이유가 분명하다고 생각합니다. 헤더 파일에서 선언하는 더 일반적인 경우에 왜 필요한지 잘 모르겠습니다. 내 생각 엔 그것이 역사적이고 컴파일러를 더 쉽게 작성하기 위해 수행되었다는 것입니다.


MyInstance를 지정하지 않고 범위가 지정된 유형을 만들 수없는 이유는 무엇입니까? 새 유형 선언과 새 변수 선언이라는 두 가지 작업을 결합하면 이상하게 보입니다.
Mykola Golubyev

@Mykola 둘 다 할 수 있습니다. 내가 추가 한 샘플보기
JaredPar

70

링크 @MichaelHaren에 의해 제공은 제공하기 위해 나타납니다 근본 원인을 . 세미콜론 (다른 사람들이 지적했듯이)은 C에서 상속되었습니다. 그러나 이것이 C가 처음에 세미콜론을 사용한 이유를 설명하지 않습니다. 토론에는 다음과 같은 예제가 포함됩니다.

struct fred { int x; long y; }; 
main() 
{ 
  return 0; 
} 

이전 버전의 C는 달리 선언하지 않는 한 함수에서 암시 적 int 반환 유형을 가졌습니다. ;구조체 정의의 끝에서 를 생략하면 새로운 유형을 정의 할 fred뿐만 아니라 main()인스턴스를 반환 할 것을 선언하는 것입니다 fred. 즉 코드는 다음과 같이 구문 분석됩니다.

struct fred { int x; long y; } main()
{ 
  return 0; /* invalid return type, expected fred type */
} 

1
예, 암시 적 int 반환 유형은 여기에있는 모든 것을 처리합니다. 멋진 보석
Gaspa79 19

17

클래스는 그룹화를 위해 중괄호가 필요한 경우에도 선언이기 때문이라고 생각합니다. 그리고 예, C에서 할 수있는 역사적 주장이 있습니다.

struct
{
  float x;
  float y;
} point;

C ++에서 비슷한 작업을 수행 할 수 있어야합니다. class선언이 동일한 방식으로 작동 하는 것이 합리적입니다 .


10

짧습니다.

class MyClass
{
.
.
.
};

// instance declaration
MyClass MyInstance;  // semicolon here

클래스 선언의 중괄호 뒤의 세미콜론은 실제로 과잉이지만 C ++가 정의되는 방식입니다. 변수 선언 뒤의 세미콜론은 항상 필요하며 의미가 있습니다.


1
그렇다면 C ++는 각 선언 후에 세미콜론이 필요합니까?
Loai Nagati

1
이렇게하면 익명 클래스의 개체를 만들 수 없지만 다른 방법으로 만들 수 있습니다.
Kevin

5

나는 그러한 선언을 사용하지 않는다

class MyClass
{
.
.
.
} MyInstance;

하지만이 경우에 세미콜론이있는 이유를 이해할 수 있습니다.
그것은 int a;변수 선언 과 같기 때문입니다 .

아마도 일관성을 위해 'MyInstance'세미콜론을 생략 할 수 있습니다.


3

struct호환성을 위해 뒤에 필요 하며 어떻게 하시겠습니까?

struct MyStruct { ... };
class  MyClass  { ... }    //inconsistency

1
하지만 namespace myNamespace { ... } // inconsistent but valid어떨까요?
Chris K

3

C / C ++에서; 문 종결 자입니다. 모든 문은; 모호함을 방지하고 구문 분석을 단순화합니다. 문법은이 점에서 일관성이 있습니다. 클래스 선언 (또는 해당 문제에 대한 모든 블록)이 여러 줄이고 {}로 구분되어 있어도 여전히 단순히 명령문 ({}은 명령문의 일부 임)이므로 다음으로 종료해야합니다. (;은 구분자 / 구분자가 아님)

귀하의 예에서

class MyClass{...} MyInstance;

완전한 진술입니다. 하나의 명령문에서 선언 된 클래스의 여러 인스턴스를 정의 할 수 있습니다.

class MyClass{...} MyInstance1, MyInstance2;

이것은 단일 문에서 기본 유형의 여러 인스턴스를 선언하는 것과 완전히 일치합니다.

int a, b, c;

클래스와 인스턴스의 이러한 선언을 자주 보지 못하는 이유는 인스턴스가 "오직"할 수 있습니까? 전역 변수이고 정적 및 / 또는 Plain Old Data 구조가 아니면 전역 개체를 원하지 않는 경우가 많습니다.


2
그러나 함수 정의도 선언문이지만 세미콜론이 없습니다.
Jiapeng Zhang
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.