Определение терминологии - Область применения C

Существует ли конкретный термин для следующего типа кода C? В моем примере я хочу увеличить глубину охвата для небольшого фрагмента кода внутри функции без необходимости использовать ненужные операторы if/else/for, чтобы я мог повторно объявить переменную с тем же именем несколько раз. например:

void myfunc(void) {
  int a = 0, b = 1;
  {
    int c;
    c = 3;
    printf("c is: %d", c);
  }

  a = 2;
  {
    int c = 5;
    printf("c is %d", c);
  }

}

Каков термин, используемый для описания того, как я просто обернул некоторый код в фигурные скобки и увеличил глубину области видимости, так что остальная часть функции не увидит 'c' int?

Спасибо!

Ответ 1

Сфера определяется как the area in which the object is active. В C. имеется пять областей. Они следующие.

Масштаб программы

Это объявления в большинстве слоев. Они доступны для жизни программы. Все функции имеют эту область. Это иначе известно как глобальная область.

Масштаб файла

Он имеет такую ​​область, что к нему можно получить доступ с этой точки до конца файла.

void dummy(void) { }
// absence of static automatically gives program scope to `dummy()`

static void dummy(void) { } 
// static keyword here gives function `dummy()` a file scope 

Область функций

Только метки имеют эту область. В этой области действия они активны до конца функции.

void printFun()
{
print:
    printf("i is less than j");
}

int main()
{
    int i=1,j=2;
    if(i < j)
        goto print;
}

Этот код будет отмечен ошибкой компилятором, говорящим, что печать меток неизвестна, поскольку метки имеют только область действия. Если вам нужно безоговорочно прыгать между функциями, вам нужно использовать функции setjmp/longjmp.

Область блока

Объявления, которые активны до конца блока (где блок определяется как инструкции в { }). Все объявления внутри функции имеют только блокировку.

int fun(int a, int b)
{
    int c; 
    {   
        int d;
    }
    // a, b, c, d all have block scope
}

Как я уже сказал, область действия применяется только к меткам. Поэтому не следует путать с областью блока. Аргументы функции обрабатываются так, как если бы они были объявлены в начале блока другими переменными (помните, что тело функции также рассматривается как блок внутри { }). Таким образом, аргументы функции имеют область блока (не область действия).

Локальная область - это общее использование для ссылки на область действия, которая является либо функцией, либо областью блока.

Область прототипа

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

int add(int a, float b);

Здесь переменные a и b имеют область прототипа.

Выбор минимальной области

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

Ответ 2

Я бы сказал, что вы вводите новую локальную область или вложенную область или блок.

Это становится очень важным в С++, когда вы активно пользуетесь этим:

{
    std::lock_guard<std::mutex> lk(my_mutex);

    do_critical_stuff();  // might throw exception?
}
// the lock is released automagically!

Но даже в C хорошая практика - использовать только локальные переменные, где они нужны, и не выводить их в ненужные широкие области.

Ответ 3

Термин - область действия.

K & R2 определяет область слова как

Название также имеет область действия, которая является областью программы, в которой известно

Сфера - это слово, которое относится к видимости идентификатора.