Подтвердить что ты не робот

Кудрявые скобки в C и С++

Почему эта компиляция:

int main() 
{
    {}  
}

Но это не так:

    {}

int main() 
{  
}
4b9b3361

Ответ 1

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

Ответ 2

{} - инструкция do-nothing (в частности, в грамматике C это пустой составной оператор). Вы можете поместить утверждения в функции. Вы не можете ставить утверждения в другом месте.

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

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

Ответ 3

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

Если вы внутри, вы можете иметь все {} блоки, которые вы хотите.

Ответ 4

Поскольку единственное, что может показаться на верхнем уровне единицы перевода, - это объявления или определения функций; составные заявления (пустые или нет) могут не отображаться на этом уровне.