programing tip

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

itbloger 2020. 10. 24. 09:42
반응형

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


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 ++가 정의되는 방식입니다. 변수 선언 뒤의 세미콜론은 항상 필요하며 의미가 있습니다.


I do not use such declarations

class MyClass
{
.
.
.
} MyInstance;

But in this case I can understand why is semicolon there.
Because it is like int a; - variable declaration.

Probably for consistence as you can omit 'MyInstance' semicolon stays there.


It is needed after a struct for compatibility reasons, and how would you like this:

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

In C/C++ the ; is a statement terminator. All statements are terminated with ; to avoid ambiguity (and to simplify parsing). The grammar is consistent in this respect. Even though a class declaration (or any block for that matter) is multiple lines long and is delimited with {} it is still simply a statement (the { } is part of the statement) hence needs to be terminated with ; (The ; is not a separator/delimitor)

In your example

class MyClass{...} MyInstance;

is the complete statement. One could define multiple instances of the declared class in a single statement

class MyClass{...} MyInstance1, MyInstance2;

This is completely consistent with declaring multiple instances of a primitive type in a single statement:

int a, b, c;

The reason one does not often see such desclaration of class and instance, is the instance could ?only? be a global variable, and you don't really often want global objects unless they are static and/or Plain Old Data structures.

참고URL : https://stackoverflow.com/questions/785686/semicolon-after-class-declaration-braces

반응형