2012-03-13 6 views
0

Посмотрите на следующий фрагмент кода ...C - статическая переменная маскирования глобальная переменная

File1.h

void somefunc(int); 

file1.c

#include "File1.h" 

extern int var; 

void somefunc(int x) 
{ 
    ...... 
    var ++; 
    etc, etc, 
    .... 
    return; 
} 

File2.h

static int var; 

void someotherfunc(int); 

Файл2.c

#include "File2.h" 
#include "File1.h" 

int var; 

void someotherfunc(int z) 
{ 
    z = etc etc; 
    var --; 
    ...... 
    somefunc(z); 
    ..... 
    return; 
} 

Эти четыре файла скомпилированы без проблем. Проблема возникает, когда я пытаюсь инициализировать переменную 'var'. Если «var» инициализируется в File2.c, где это глобальная переменная, код компилируется без каких-либо проблем. Но когда я пытаюсь инициализировать статическую переменную в File2.h, компилятор выдает сообщение об ошибке: «переменная« var »в File1.c не определена». Может кто-нибудь рассказать, что здесь происходит.

Я просто пытался понять концепцию статических переменных и столкнулся с этой путаницей. Любая помощь будет оценена по достоинству.

+3

Зачем вам нужно делать «static int var»? в файле заголовка? Это создаст одну копию статики для каждого .c файла, в который вы включаете этот заголовочный файл. – Jay

+1

Файл заголовка включается несколькими файлами, что нарушает правило единого определения. «Вы можете объявлять все столько раз, сколько хотите, но вы можете определить его только один раз». –

+0

Это не так, не так ли? 'File2.h' (тот, у кого есть определение) включен только _once._ Или вы говорите о том, что вы определяете var как в этом заголовке, так и в' File2.c'? – paxdiablo

ответ

2

статический int var;

Это дает var внутреннюю связь в ЕП file2.c, что могло бы следовать (да, даже если extern декларации следует).

Таким образом, если первое декларируемое объявление - static int var, то эта единица перевода var будет навсегда внутренней, недоступной для других единиц перевода.

6.2.2-4

Для идентифицируемого эр объявлен с хранением класса Специфического эр extern [File1.h] в объеме, в котором перед декларацией этого идентифицируемого эр виден [один в File2.h], если в предыдущем заявлении указано внутреннее или внешнее соединение [, оно определяет внутреннее значение], то связь идентификатора с> более поздним объявлением равна так же, как и связь, указанная в предыдущем заявлении .

2

Не может быть статическим. Static означает, что его «видимость» (а не официальный термин, но, вероятно, более понятная) ограничена исходным файлом C, который он появляется (в данном случае это File2.c).

Это означает, что, когда вы пытаетесь связать вместе File1 и File2, компоновщик не сможет увидеть var в File2, поэтому вы получаете сообщение об ошибке.

Если вы хотите, чтобы он был доступен с File1.c, выровняйте «статический» бит.На самом деле, поскольку у вас уже есть var, определенный в File2.c, выровняйте всю линию от File2.h.

+0

Спасибо! :) Я прекрасно понимаю, что вы пытаетесь мне сказать. Да, статичность делает видимость «var» внутренней для File2.c. Но ват здесь происходит, что для «var» назначаются два отдельных пространства памяти. Верно также одно для статической переменной и одно для глобальной переменной и выполнения программы. Но как только я делаю назначение статической переменной в File2.h как static int var = 2; компилятор затем выдает сообщение об ошибке «var in File1.c undefined». Я хочу знать, что здесь происходит и почему? – cbhavi

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