Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Видимость статических переменных


Автор: yngwie19 27.5.2009, 16:39
Здравствуйте. Скажите пожалуйста есть такой код:
Код

void MyFunc();
int main()
{
      MyFunc();
     ............
      MyFunc();
     return 0;
}
void MyFunc()
{
      static int a = 10;
      static int b = 5;
}


Вопрос. При первом вызове функции MyFunc(), создаются и инициализируются статические переменные a и b, после выхода из этой функции они останутся существовать до завершения работы программы так?. Тогда что произойдет когда мы второй раз вызовем эту функцию? не будет ли конфликта? переменные ведь уже созданы в первом вызове этой функции.

Автор: mes 27.5.2009, 16:50
при последующем входе в функцию переменные будут уже созданы и хранят значение оставшееся с момента последнего посещения.

Автор: yngwie19 27.5.2009, 19:53
mes, т.е будет синтаксическая ошибка?

Автор: mes 27.5.2009, 19:56
Цитата(yngwie19 @  27.5.2009,  18:53 Найти цитируемый пост)
mes, т.е будет синтаксическая ошибка? 

почему ? особенно интересует почему "синтаксическая" ?!  smile 
все будет в порядке.

попробуйте такой пример, думаю он поможет разобраться. 
Код

int f(int i)
{
      static int a = 10;
      
      a+=i;
      return a;       
}

for (int i=0; i<100; ++i)
 std::cout << f(i)<<std::endl;

Автор: yngwie19 27.5.2009, 20:01
просто мне не понятно при программировании на WinAPI в  функции окна например так:
Код

LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
static cxClient, cyClient;
    switch (msg)
    {
        case WM_CREATE:
        return 0;
        case WM_PAINT:
                PAINTSTRUCT ps;
                        TextOut(hdc,cxClient/2,cyClient/2,"Hello WinAPI",13);
                EndPaint(hwnd,&ps);
            return 0;
        case WM_SIZE:
                cxClient  = LOWORD(lParam);
                        cyClient = HIWORD(lParam);
            return 0;
        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;
        default:
            return DefWindowProc(hwnd,msg,wParam,lParam);
    }

переменные cxClient и cyClient, получают значения из WM_SIZE, однако при обработке любого сообщения опять вызывается объявления cxClient и cyClient, т.к они находятся в самом начале функции WndProc. Как тут не происходит ошибки?

Добавлено через 6 минут и 3 секунды
mes, т.е инициализировав static int a = 10; один раз, следующие вызовы этой функций f(i) игнорируют эту инициализацию, переменная a уже к моменту второго вызова существует.

Автор: mes 27.5.2009, 20:12
Цитата(yngwie19 @  27.5.2009,  19:01 Найти цитируемый пост)
т.е инициализировав static int a = 10; один раз, следующие вызовы этой функций f(i) игнорируют эту инициализацию, переменная a уже к моменту второго вызова существует. 

да, они просто с ней работают.

Добавлено через 1 минуту и 23 секунды
P.S.
Цитата(yngwie19 @  27.5.2009,  19:01 Найти цитируемый пост)
static cxClient, cyClient;

а тут забыт тип smile

Автор: yngwie19 27.5.2009, 21:48
mes, спасибо

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)