Является ли эта практика ручного нанесения областей применения стандартной C? - PullRequest
1 голос
/ 06 февраля 2020

Создает ли локальные области видимости только пару скобок, это будет считаться стандартным C?

#include <stdio.h>

int main(int argc, char *argv[]) {
    {
        register char x = 'a';
        putchar(x); // works
    }
    //putchar(x); wont work
}

Или лучше не использовать это? Это расширение компилятора G CC?

Мне однажды сказали, что принятая практика - do {...} while (0); l oop. Правда ли, что все C компиляторы распознают эту практику так же, как можно с уверенностью предположить, что любой данный C компилятор распознает оператор if?

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

Ответы [ 3 ]

4 голосов
/ 06 февраля 2020

Да, это стандарт; это создание области видимости блока, что поддерживается языком C.

Относительно части «лучше всего использовать», это зависит, конечно, это может немного смущать некоторых людей.

Это может оказаться очень полезным с сгенерированным кодом, поэтому вам не нужно беспокоиться (столько) об уникальных идентификаторах для локальных переменных:

int main(int argc, char *argv[]) {
  {
    int x = 4;
    printf("%d\n", x);
  }
  {
    int x = 5;
    printf("%d\n", x);
  }
}
2 голосов
/ 06 февраля 2020

Да, это стандарт; Вы всегда можете ввести новую область видимости с дополнительной парой {}

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


#if DEBUG
    {
    struct node *tmp;
    for (tmp=this; tmp; tmp= tmp->next) {
        printf(stderr, "Node %u: %s\n", tmp->num, tmp->name);
        }
     }
#endif
0 голосов
/ 06 февраля 2020

Это стандарт C.

Раздел 6.8p1 C стандарта дает следующий синтаксис для оператора:

statement:
  labeled-statement
  compound-statement
  expression-statement
  selection-statement
  iteration-statement
  jump-statement

Где compound-statement определено в разделе 6.8.2p1:

compound-statement:
   { block-item-list(opt) }

block-item-list:
  block-item
  block-item-list block-item

block-item:
  declaration
  statement

То, что это говорит о том, что в любом месте, где может произойти оператор, составной оператор (т.е. может произойти набор операторов, окруженный {}).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...