클래스 선언 중괄호 뒤의 세미콜론 대한 C 호환성 관점에서 얻었지만 클래스는

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

class MyClass
{
.
.
.
} MyInstance;

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

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



답변

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

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

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

  struct ADifferentType { int x; };
}

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


답변

링크 @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 */
}


답변

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

struct
{
  float x;
  float y;
} point;

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


답변

짧습니다.

class MyClass
{
.
.
.
};

// instance declaration
MyClass MyInstance;  // semicolon here

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


답변

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

class MyClass
{
.
.
.
} MyInstance;

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

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


답변

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

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


답변

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

귀하의 예에서

class MyClass{...} MyInstance;

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

class MyClass{...} MyInstance1, MyInstance2;

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

int a, b, c;

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