2014-10-08 3 views
3

новый для C++.Разница между}; и} в C++

Woking в проекте для назначения, а в некотором примере кода я нашел методы, заканчивающиеся на}; вместо типичного (ожидается)}

Например:

CircBuffer::CircBuffer() 
{ 
    cout<<"constructor called\n"; 
    cout<<"Buffer has " << BufferSize << "elements\n"; 

    for (int i = 0; i<= BufferSize -1; i++) 
    { 
     Buffer[i] = 0; 
    } 

    ReadIn = WriteIn = 0; 
    setDelay(0); 

}; // <=== HERE 

Я не могу найти какую-либо информацию о том, почему это будет сделано в Интернете.

Спасибо, Льюис

+0

Это пустое заявление. только определения типа требуют точки с запятой: 'class A {...};' function do not – BeyelerStudios

+0

Пустой оператор it.it похож на высказывание «не выполнять какой-либо оператор в этой строке» – DesirePRG

+7

Скорее всего, опечатка – Martin

ответ

10

Этот конечный ; в пространстве имен составляет пустой декларации. Что у вас есть в приведенном выше коде, рассматривается компилятором как

CircBuffer::CircBuffer() 
{ 
    ... 
}  // <- the `CircBuffer::CircBuffer` definition ends here 

;  // <- an empty declaration that declares nothing 

I.e. определение метода на самом деле не заканчивается }; с точки зрения компилятора. Он заканчивается }, и ; обрабатывается полностью отдельно и независимо.

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

Обратите внимание, что вышеизложенное относится только к определениям вне класса (как в вашем примере). С определениями функций члена в своем классе задний ; всегда был законным (и необязательно)

class C 
{ 
    C() 
    { 
    ... 
    }; // <- ';' not required, but legal even in C++98 
}; 

(В этом случае дополнительный ; на самом деле является частью определения члена, а это означает, что определение действительно заканчивается в }; и не вводит пустую декларацию.)

Когда вы видите что-то подобное в фактическом коде, это, вероятно, просто плохая привычка, возможно, основанная на путанице между контекстами определения в классе и вне класса.

+0

Конечно, вы правы. Я исправил свой собственный ответ. – Gorpik

+0

Также обратите внимание, что точка с запятой после фиксации 'class C' не является * необязательной. – thirtythreeforty

1

Может быть, для последовательности или это может быть напоминает старый код, если оригинал был просто декларация:

CircBuffer::CircBuffer(); 

и кто-то хотел бы добавить реализацию инлайн , он, возможно, нажал перед задним числом ; и начал писать там тело, забыв удалить ;.

Смежные вопросы