Статические переменные и extern в простом C

Есть ли разница между объявлением статической переменной вне функции и объявлением статической переменной внутри функции?

Кроме того, в чем разница между объявлением переменной как статической и просто объявлением внешней переменной?


person GetOffMyLawn    schedule 06.05.2010    source источник


Ответы (2)


Разница в том, что статическая переменная внутри функции видна только внутри функции, тогда как статическая переменная снаружи может быть видна любой функции от точки объявления до конца единицы перевода.

В остальном они ведут себя так же.

Объявление переменной вне функции без ключевого слова static означает, что она видна (доступна) вне файла (единицы перевода), в котором она определена (а также от точки определения до конца единицы перевода). Если вы объявляете переменную как extern, это означает, что есть определение где-то еще - возможно, в той же единице перевода, но, скорее всего, в другой. Обратите внимание, что можно объявить внешнюю переменную внутри функции, но ее можно определить только вне функции.

person Jonathan Leffler    schedule 06.05.2010

Первый пример:

class SoTest
{
public:
    SoTest(const char *name)
    {
        printf("C'tor called of %s\t(%#x) object\n",name,this);
    }
    static SoTest ClassStaticObj;
};

static SoTest CStaticObj("CStaticObj");
SoTest SoTest::ClassStaticObj("ClassStaticObj");

void function()
{
    for (int i = 0; i < 2;i++)
    {
        static SoTest FunctionStaticObj("FunctionStaticObj");
            SoTest FunctionObj("FunctionObj");
    }
}

int _tmain(int argc, _TCHAR* argv[])
{
    printf("enter main\n");
    function();
    function();
    getchar();;
    return 0;
}

производит:

    C'tor called of CStaticObj      (0x419168) object
C'tor called of ClassStaticObj  (0x419169) object
enter main
C'tor called of FunctionStaticObj       (0x419160) object
C'tor called of FunctionObj     (0x12fe77) object
C'tor called of FunctionObj     (0x12fe77) object
C'tor called of FunctionObj     (0x12fe77) object
C'tor called of FunctionObj     (0x12fe77) object

Теперь ваш вопрос (ы)

Есть ли разница между объявлением статической переменной вне функции и объявлением статической переменной внутри функции?

Это совершенно разные проблемы: статическая переменная / функция вне функции не видна вне модуля компиляции.

статическая переменная внутри функции выделяется в глобальных данных и инициализируется только один раз во время первого возникновения (см., что FunctionStaticObj была инициализирована после main в отличие от других объектов.

Кроме того, в чем разница между объявлением переменной как статической и просто объявлением внешней переменной?

Опять же, статический означает, что он не виден вне модуля компиляции.

extern означает «он не определен здесь, хотя в другом модуле компиляции и компоновщик будет управлять им», поэтому вы можете сделать столько объявлений extern, сколько захотите, но только одно определение не extern.

person XAder    schedule 06.05.2010