Точка с запятой после скобок объявления класса - PullRequest
70 голосов
/ 24 апреля 2009

В классах C ++, почему точка с запятой после закрывающей скобки? Я регулярно забываю об этом и получаю ошибки компилятора, а значит и потерянное время. Мне кажется это несколько лишним, что вряд ли так. Люди действительно делают такие вещи, как:

class MyClass
{
.
.
.
} MyInstance;

Я получаю его с точки зрения совместимости с Си для структур и перечислений, но поскольку классы не являются частью языка Си, я предполагаю, что в первую очередь сохраняется согласованность между аналогичными конструкциями объявлений.

То, что я искал, было больше связано с обоснованием проектирования, нежели с возможностью что-либо изменить, хотя хорошая IDE для завершения кода может перехватить это перед компиляцией.

Ответы [ 7 ]

55 голосов
/ 22 мая 2014

ссылка , предоставленная @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 */
} 
42 голосов
/ 24 апреля 2009

Точка с запятой после закрывающей скобки в объявлении типа требуется языком. Так было с самых ранних версий C.

И да, люди действительно делают заявление, которое вы только что там выставили. Это полезно для создания типов областей действия внутри методов.

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

  struct ADifferentType { int x; };
}

В этом случае, я думаю, понятно, зачем нужны точки с запятой. Что касается необходимости в более общем случае объявления в заголовочном файле, я не уверен. Мое предположение состоит в том, что он исторический и был сделан, чтобы упростить написание компилятора

15 голосов
/ 24 апреля 2009

Полагаю, это потому, что классы являются объявлениями, даже если им нужны скобки для группировки. И да, есть исторический аргумент, что, поскольку в C вы могли бы сделать

struct
{
  float x;
  float y;
} point;

вы должны в C ++ быть в состоянии сделать то же самое, имеет смысл для объявления class вести себя так же.

8 голосов
/ 24 апреля 2009

Это коротко для

class MyClass
{
.
.
.
};

// instance declaration
MyClass MyInstance;  // semicolon here

Точка с запятой после фигурных скобок объявления класса на самом деле излишня, но именно так определяется C ++. Точка с запятой после объявления переменной всегда нужна и имеет смысл.

3 голосов
/ 25 апреля 2009

В C / C ++; является ограничителем оператора. Все заявления заканчиваются на; избежать двусмысленности (и упростить разбор). Грамматика последовательна в этом отношении. Даже если объявление класса (или любой блок в этом отношении) это несколько строк в длину и с разделителем {} это все еще просто оператор ({} является частью оператора) следовательно, должен быть завершен с; (; Не является разделителем / разделителем)

В вашем примере

class MyClass{...} MyInstance;

является полным утверждением. Можно определить несколько экземпляров объявленного класса в одном выражении

class MyClass{...} MyInstance1, MyInstance2;

Это полностью согласуется с объявлением нескольких экземпляров примитивного типа в одном выражении:

int a, b, c;

Причина, по которой человек часто не видит такого описания класса и экземпляра, - может ли экземпляр? быть глобальной переменной, и вам не часто нужны глобальные объекты, если они не являются статическими и / или простыми структурами старых данных.

3 голосов
/ 24 апреля 2009

Это необходимо после struct по причинам совместимости, и как бы вы хотели это:

struct MyStruct { ... };
class  MyClass  { ... }    //inconsistency
3 голосов
/ 24 апреля 2009

Я не использую такие объявления

class MyClass
{
.
.
.
} MyInstance;

Но в этом случае я могу понять, почему там точка с запятой.
Потому что это похоже на int a; - объявление переменной.

Вероятно, для консистенции, так как вы можете пропустить точку с запятой MyInstance, она остается там.

...