2012-01-11 7 views
2

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

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?

Спасибо!

ответ

4

Объем определяется как the area in which the object is active. На С. имеется пять областей. Они заключаются в следующем.

Программа Scope

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

Объем файла

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

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 

Функция 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 называются областью действия прототипа.

Выбор Minimal Scope

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

+0

Благодарим вас за очень тщательное и полезное обсуждение. Я не знал о формальных именах для разных уровней охвата. – DevNull

+0

@GirLovesTacos Существует еще одна область действия - лексическая область! .. Google для этого! :) –

2

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

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

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

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

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

+0

«Представляем новую локальную область» - это фраза, которую я искал. Благодаря! – DevNull

0

Термин scope.

К & R2 определяет слово области действия, как

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

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

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