Определение терминологии - Область применения в Си - PullRequest
2 голосов
/ 11 января 2012

Есть ли конкретный термин для следующего типа кода 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?*

Спасибо!

Ответы [ 3 ]

4 голосов
/ 11 января 2012

Область действия определяется как 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 голосов
/ 11 января 2012

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

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

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

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

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

0 голосов
/ 11 января 2012

Термин scope .

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

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

Область действия - это слово, которое относится к видимости идентификатора.

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