Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
0 / 0 / 0
Регистрация: 26.08.2014
Сообщений: 14

Почему static char []

29.12.2018, 01:50. Показов 2670. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Почему char szAppName[] = "HelloWin" как static? Не могу понять в чем смысл, туплю. Спасибо.

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
/*------------------------------------------------------------
   HELLOWIN.C -- Displays "Hello, Windows 95!" in client area
                 (c) Charles Petzold, 1996
  ------------------------------------------------------------*/
 
#include <windows.h>
 
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
 
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    PSTR szCmdLine, int iCmdShow)
     {
     static char szAppName[] = "HelloWin" ;
     HWND        hwnd ;
     MSG         msg ;
     WNDCLASSEX  wndclass ;
 
     wndclass.cbSize        = sizeof (wndclass) ;
     wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
     wndclass.lpfnWndProc   = WndProc ;
     wndclass.cbClsExtra    = 0 ;
     wndclass.cbWndExtra    = 0 ;
     wndclass.hInstance     = hInstance ;
     wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;
     wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
     wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
     wndclass.lpszMenuName  = NULL ;
     wndclass.lpszClassName = szAppName ;
     wndclass.hIconSm       = LoadIcon (NULL, IDI_APPLICATION) ;
 
     RegisterClassEx (&wndclass) ;
 
     hwnd = CreateWindow (szAppName,         // window class name
                    "The Hello Program",     // window caption
                    WS_OVERLAPPEDWINDOW,     // window style
                    CW_USEDEFAULT,           // initial x position
                    CW_USEDEFAULT,           // initial y position
                    CW_USEDEFAULT,           // initial x size
                    CW_USEDEFAULT,           // initial y size
                    NULL,                    // parent window handle
                    NULL,                    // window menu handle
                    hInstance,               // program instance handle
                    NULL) ;                  // creation parameters
 
     ShowWindow (hwnd, iCmdShow) ;
     UpdateWindow (hwnd) ;
 
     while (GetMessage (&msg, NULL, 0, 0))
          {
          TranslateMessage (&msg) ;
          DispatchMessage (&msg) ;
          }
     return msg.wParam ;
     }
 
LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
    {
     HDC         hdc ;
     PAINTSTRUCT ps ;
     RECT        rect ;
 
     switch (iMsg)
          {
          case WM_CREATE :
               PlaySound ("hellowin.wav", NULL, SND_FILENAME | SND_ASYNC) ;
               return 0 ;
 
          case WM_PAINT :
               hdc = BeginPaint (hwnd, &ps) ;
 
               GetClientRect (hwnd, &rect) ;
 
               DrawText (hdc, "Hello, Windows 95!", -1, &rect,
                         DT_SINGLELINE | DT_CENTER | DT_VCENTER) ;
 
               EndPaint (hwnd, &ps) ;
               return 0 ;
 
          case WM_DESTROY :
               PostQuitMessage (0) ;
               return 0 ;
          }
 
     return DefWindowProc (hwnd, iMsg, wParam, lParam) ;
     }
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
29.12.2018, 01:50
Ответы с готовыми решениями:

Как компилятор обрабатывает член класса static constexpr const char*
Привет! Наткнулся на непонятный момент class Foo { public: static constexpr const char* PTR = &quot;value&quot;; }; ...

Запись в static const char[]
У меня есть строка, содержащая некий текст. std::string ex_text = &quot;&lt;h1&gt;TextTextText&lt;/h1&gt;&quot;; Также у меня есть переменная, которая должна...

что значит static char?
подскажите что означает static char ret;

8
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,910
29.12.2018, 10:12
Он может не быть static. Этой переменной может вообще не быть:
C
1
2
3
4
5
6
7
8
...
wndclass.lpszClassName = "HelloWin" ;
wndclass.hIconSm       = LoadIcon (NULL, IDI_APPLICATION) ;
 
RegisterClassEx (&wndclass) ;
 
hwnd = CreateWindow ("HelloWin",
...
0
0 / 0 / 0
Регистрация: 26.08.2014
Сообщений: 14
29.12.2018, 14:49  [ТС]
Это понятно. Но почему автор сделал именно static? Думаю была какая-то причина, хочу узнать какая.

Добавлено через 1 час 33 минуты
Вообщем, подсказали мне уже. Указатель на данную переменную передается и используется после того как winmain отработает. Если использовать не static, будет неопределенное поведение. Не знаю на скок правильно мне подсказали, так как "неопределенного поведения" при использовании static я не увидел.

Добавлено через 9 минут
при неиспользовании static (опечатался)
0
Maniac
Эксперт С++
 Аватар для ISergey
1464 / 965 / 160
Регистрация: 02.01.2009
Сообщений: 2,820
Записей в блоге: 1
29.12.2018, 14:55
Цитата Сообщение от Lifeda92 Посмотреть сообщение
Указатель на данную переменную передается и используется после того как winmain отработает. Если использовать не static, будет неопределенное поведение. Не знаю на скок правильно мне подсказали, так как "неопределенного поведения" при использовании static я не увидел.
Бред вам сказали. После того как WinMain отработает, приложение умрет.
0
0 / 0 / 0
Регистрация: 26.08.2014
Сообщений: 14
29.12.2018, 14:57  [ТС]
Еще были ответы, что это просто соглашение так писать. :/
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,910
29.12.2018, 15:53
Цитата Сообщение от ISergey Посмотреть сообщение
Бред вам сказали. После того как WinMain отработает, приложение умрет.
Не совсем так. Создание окна может быть вынесено в отдельную функцию, соответственно, содержимое локальной переменной потеряется после выхода.
Правда не очень понятно используется ли указатель на эту строку где-то после CreateWindow. Скорее всего, нет.
Ну и другой вопрос зачем делать static если можно сделать const. Разве что чтобы передавать имя windowclass'а внутрь функции... хотя сомнительно
0
29.12.2018, 21:53

Не по теме:

Цитата Сообщение от Lifeda92 Посмотреть сообщение
"неопределенного поведения" при использовании static я не увидел
Безотносительно корректности того, что вам сказали, неопределенное поведение вполне может проявляться как "ничего (плохого) не происходит". Так что корректность подобных подсказок таким способом определить нельзя.

0
26 / 26 / 3
Регистрация: 13.04.2012
Сообщений: 61
30.12.2018, 14:53
Мне кажется тут не все понимают вообще что такое статическая переменная, поэтому рекомендую почитать этот раздел в отличном мануале: https://ravesli.com/urok-51-st... eremennye/

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

При этом сам текст "HelloWin" в любом случае храниться в глобальной области данный и не затрётся сам по себе.
static здесь используют чтобы продлить жизнь указателя на "HelloWin".
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,910
30.12.2018, 15:48
Да все знают что такое static.
Лучше скажите зачем это в данном конкретном случае. Точно ли это нужно?
Точнее так: в приведенном коде это не нужно точно: лучше воспользоваться константной строкой. Для какого изменения кода использование static будет более оптимальным и есть ли такое вообще
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
30.12.2018, 15:48
Помогаю со студенческими работами здесь

Static function 'void leave(char *)' declared but not defined
скорее всего у меня ошибка с инклюдами и хедер файлами вроде нагугил глобальные переменные через экстерн а как статические функции в хедер...

Строки: почему компилятор пишет , что переменная типа char несовместима с const char?
char pass; int password( int d) { int m; char p; cout &lt;&lt; &quot;Введите пароль для доступа к информации:&quot;; cin &gt;&gt; p; ...

Std::fstream почему функция write принимает параметр char* а не unsigned char* (аля byte*) ?
Ну собственно сабж... std::fstream fs; fs.write((char*)..) В случае бинарного потока я допустим пишу байты функцией write, как...

Почему у массивов типа char может быть утечка памяти, а у указателей char с выделенной памятью - нет?
Тут будет утечка памяти: #include&lt;iostream&gt; using namespace std; int main() { char name; cin &gt;&gt; name; cout &lt;&lt;...

Почему нужен static?
Объясните пожалуйста, почему при создании объекта класса А (класс А объявлен в классе Main) возникает ошибка, что класс A должен быть...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru