Статические переменные и внешние в простой C - PullRequest
0 голосов
/ 06 мая 2010

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

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

Ответы [ 2 ]

4 голосов
/ 06 мая 2010

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

В противном случае они ведут себя одинаково.

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

0 голосов
/ 06 мая 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 означает «здесь не определено, хотя в другом модуле компиляции и компоновщик будет управлять им», поэтому вы можете сделать столько внешних объявлений, сколько вам нужно, но только одно не внешнее определение.

...