Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.69/48: Рейтинг темы: голосов - 48, средняя оценка - 4.69
 Аватар для pcmax
443 / 74 / 7
Регистрация: 29.01.2018
Сообщений: 1,274

Чем отличается static local variable от static global variable?

02.02.2019, 15:44. Показов 9996. Ответов 37
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
привет

вроде уже ребята объясняли, но что -то я не понял....

скажите пожалуйста,чем отличается static local variable от static global variable?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
02.02.2019, 15:44
Ответы с готовыми решениями:

О чем говорит ошибка "Non-static variable D cannot be referenced from a static context"
non-static variable D cannot be referenced from a static context Вот эта ошибка мне часто попадается. Подскажите что это означает? И...

Ошибка: non-static variable this cannot be referenced from a static context
Добрый вечер! Не пинайте сильно ногами, недавно решил взяться за обучение языку Java, что в мои годы уже подвиг сам по себе. Зубрю...

Non-static variable this cannot be referenced from a static context
Выводит следующие ошибки при компиляции данной программы import java.io.*; class HashTableApp { class DataItem { ...

37
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
03.07.2019, 16:39
Лучший ответ Сообщение было отмечено pcmax как решение

Решение

Студворк — интернет-сервис помощи студентам
Цитата Сообщение от pcmax Посмотреть сообщение
но на мой взгляд static global -это бред
Теплое и мягкое?
Цитата Сообщение от pcmax Посмотреть сообщение
global виндна из всех файлов состовляющих программу
В C++ раздельная компиляция и тип линковки никак не влияет на глобальность/локальность.
То что описано на уровне файла - глобальное.
Цитата Сообщение от pcmax Посмотреть сообщение
а static переменная винда лишь из того файла, где она создана
А еще я могу подцепить объектник исходник которого на ассемблере и дернуть оттуда экспортируемое имя.
Цитата Сообщение от pcmax Посмотреть сообщение
значит static ограничит global
static меняет вид линковки, а не глобальность.

Еще раз
C++
1
2
static int x;//Это СТАТИЧЕСКАЯ переменная (static storage duration)
int y;//И это ТОЖЕ СТАТИЧЕСКАЯ переменная (static storage duration)
Отличается у них только тип линковки (внутренняя, внешняя).
Обе в глобальном пространстве имен - значит глобальные.
A name with global namespace scope is said to be a global name.
1
 Аватар для pcmax
443 / 74 / 7
Регистрация: 29.01.2018
Сообщений: 1,274
03.07.2019, 17:30  [ТС]
вобщем отличие от static и global variable только в линковании. правильно?
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
03.07.2019, 17:33
Цитата Сообщение от pcmax Посмотреть сообщение
вобщем отличие от static и global variable только в линковании. правильно?
Отличие теплого от мягкого только в толщине. правильно?
1
 Аватар для pcmax
443 / 74 / 7
Регистрация: 29.01.2018
Сообщений: 1,274
03.07.2019, 17:47  [ТС]
Цитата Сообщение от Croessmah Посмотреть сообщение
Отличие теплого от мягкого только в толщине. правильно?
ну я не спец в этом.


скажите пожалуйста, какие конкретные отличия , static variable от static global и от static global variable.

скажите уже как спец, но только чтобы было понятно
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
03.07.2019, 17:56
pcmax, я понятия не имею что ты называешь static variable, static global и static global variable. Что это такое в твоей версии?
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
03.07.2019, 18:18
Лучший ответ Сообщение было отмечено pcmax как решение

Решение

pcmax, вам уже говорили, что смысл слова статик зависит от области видимости. Если это область функции то это локальная статическая переменная функции, а если класса то -> класса. Это о мягком. То есть родственные концепции по смыслу. А если static применено к глобальной переменной или функции (имени вообще говоря) то речь идёт о линковке. Тут видимость ограничивают глобальным неймспейсом файла (единицы трансляции). Это тёплое. Оно не имеет общего с мягким. Почему всё так? Потому что жизнь несправедлива как дерьмо это так получилось в ходе развития языка начиная от реализации совместимости с языком С. Занимательная история. Которую мало кто помнит уже.
1
 Аватар для pcmax
443 / 74 / 7
Регистрация: 29.01.2018
Сообщений: 1,274
03.07.2019, 18:36  [ТС]
Цитата Сообщение от Croessmah Посмотреть сообщение
я понятия не имею что ты называешь static variable, static global и static global variable. Что это такое в твоей версии?
__________________
ладно не злись

если ты понятия не имеешь, то я и подавно

Добавлено через 5 минут
Цитата Сообщение от IGPIGP Посмотреть сообщение
вам уже говорили, что смысл слова статик зависит от области видимости.
да, Вы правы, говорили. но я решил что уважаемый Croessmah видит более глубокий смысл. Ну посути так и есть: этот человек упомянул даже линкувку и комплицию и поэтому я решил, что он щас выдаст что-то такое , что Струструп решит добавить в свои книги по С++.
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
03.07.2019, 18:41
Лучший ответ Сообщение было отмечено pcmax как решение

Решение

Цитата Сообщение от pcmax Посмотреть сообщение
то я и подавно
Т.е. препод именно в форме чем отличается static local variable от static global variable вопрос задал?

Добавлено через 3 минуты
Цитата Сообщение от pcmax Посмотреть сообщение
и поэтому я решил, что выдаст что-то такое
В данном случае тебе объясняют, что глобальной не-статической переменной не бывает, все глобальные переменные статические. А ключевое слово static у глобальной переменной обозначает не то что она статическая или нет (т.к. всегда статическая), а способ её обработки компилятором и линковщиком.
1
 Аватар для pcmax
443 / 74 / 7
Регистрация: 29.01.2018
Сообщений: 1,274
03.07.2019, 18:47  [ТС]
Цитата Сообщение от TRam_ Посмотреть сообщение
Т.е. препод именно в форме чем отличается static local variable от static global variable вопрос задал?

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

Добавлено через 3 минуты
Цитата Сообщение от TRam_ Посмотреть сообщение
В данном случае тебе объясняют, что глобальной не-статической переменной не бывает, все глобальные переменные статические. А ключевое слово static у глобальной переменной обозначает не то что она статическая или нет (т.к. всегда статическая), а способ её обработки компилятором и линковщиком.
ну так замечательно. я это и хочу понять. и как будет компилятор обрабатывать global переменную, а как static global?
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
03.07.2019, 18:58
Цитата Сообщение от pcmax Посмотреть сообщение
если ты понятия не имеешь, то я и подавно
плдваплваытлпьлдваьмдлваь. Что это?
Если ты понятия не имеешь, то я и подавно.

Добавлено через 1 минуту
Цитата Сообщение от pcmax Посмотреть сообщение
обрабатывать global переменную, а как static global?
Слов нет... всё о том же...
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
03.07.2019, 19:08
Цитата Сообщение от pcmax Посмотреть сообщение
я решил, что он щас выдаст что-то такое
С чего бы? Он всё верно сказал. А вы ждёте что кто-то начнёт выдавать что-то такое?
Это можно, но нужно вопрос задать. А ваш вопрос достаточно некорректен. Причем, вам это говорили не в целях обвинить или как-то ещё уязвить. Это вам говорили, чтобы изменить ход вашей мысли в данной теме. И в конце концов кое-что удалось. Но ещё есть над чем работать.
1
 Аватар для pcmax
443 / 74 / 7
Регистрация: 29.01.2018
Сообщений: 1,274
03.07.2019, 19:48  [ТС]
Цитата Сообщение от Croessmah Посмотреть сообщение
Слов нет... всё о том же...

есть две переменные

C++
1
2
3
4
5
float v;
int main(){
 
return 0;
}
C++
1
2
3
4
5
6
static float v;
 
int main(){
 
return 0; 
}
c Ваших слов линковщик воспримит их по-разному. как именно?
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
03.07.2019, 19:52
Вот как-то так примерно:
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
int x1;//статическая переменная, x1 - глобальное имя, линковка внешняя
static int x1;//статическая переменная, x1 - глобальное имя, линковка внутренняя
namespace Some
{
    int x1;//статическая переменная, x1 - имя члена пространства имен Some (т.е. x1 не глобальное имя), линковка внешняя
    static int x1;//статическая переменная, x1 - имя члена пространства имен Some (т.е. x1 не глобальное имя), линковка внутренняя
}
 
struct Some
{
    static int x1;//статическая переменная, x1 - имя члена класса Some (т.е. x1 не глобальное имя), линковка внешняя
};
 
namespace {
    struct Some
    {
        static int x1;//статическая переменная, x1 - имя члена класса Some (т.е. x1 не глобальное имя), линковка внутренняя
    };
}
 
 
void foo()
{
    static int x1;//статическая переменная, x1 - имя имеет область видимости блока (т.е. x1 не глобальное имя), линковки не имеет
    int x1;//автоматическая переменная, x1 - имя имеет область видимости блока (т.е. x1 не глобальное имя), линковки не имеет
}
2
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12928 / 6796 / 1819
Регистрация: 18.10.2014
Сообщений: 17,193
03.07.2019, 21:19
Цитата Сообщение от pcmax Посмотреть сообщение
c Ваших слов линковщик воспримит их по-разному. как именно?
В первом варианте линковщик будет видеть переменную v как обычный внешний символ, экспортируемый из соответствующего объектного файла.

Во втором варианте линковщик вообще ни при чем: он никогда ничего не узнает ни о какой переменной v. В традиционной реализации вся "линковка" переменных с внутренним связыванием делается целиком и полностью компилятором. Из объектного файла символ v экспортироваться не будет и внешнему миру (в т.ч. линовщику) ничего вообще не будет известно о существовании этой переменной.
1
 Аватар для pcmax
443 / 74 / 7
Регистрация: 29.01.2018
Сообщений: 1,274
03.07.2019, 21:49  [ТС]
ну у нас как всегда: кто в лес, а кто по дрова....


опять намудрили. вас прет что ли когда вы объясняете непонятно?


static тут виновник всего.
если мы его применяем к локальной переменной, она не умрет после выполняния блока в котором была объявлена.
если static будет применен к переменной которая являлась глобальной, то тут изменится тип линковки, с внешней линковки передет на внутреннею.

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




допустим создам и ключу его в #include "file.h"
Bash
1
2
3
>file.h
nano file.h
extern int a; // тут я говорю линкувщику, что это глобальная переменная.  что когда увидишь переменную с таким же именем в main() , например, то знай , что это одно и тоже.
если же я укажу как static , то линковщик будет знать что встретив такую же переменную с этим же именем, что они принадлежат разным файлам и не есть одно.

extern - говорит что нужна внешняя линковка.
static-говорит что нужна внутренняя ликовка, если это была глобальная переменная. если же переменная была локальная, то static просто оставит ее жить после выполнения блока кода, в котором она была объявлена.

вот что я понял от вас.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12928 / 6796 / 1819
Регистрация: 18.10.2014
Сообщений: 17,193
03.07.2019, 22:09
Цитата Сообщение от pcmax Посмотреть сообщение
нужно уточнить наверное, что внешняя линковка увидев две переменных с одним именем воспримит их как одно,
Увидев два определения не-inline не-шаблонных переменных с внешним связыванием и одним и тем же именем, линкер сгенерирует сообщение об ошибке, а не "воспримит их как одно".

Цитата Сообщение от pcmax Посмотреть сообщение
extern - говорит что нужна внешняя линковка.
static-говорит что нужна внутренняя ликовка, если это была глобальная переменная. если же переменная была локальная, то static просто оставит ее жить после выполнения блока кода, в котором она была объявлена.
вот что я понял от вас.
У вас зачем-то в одну кучу перемешаны два разных понятия: линковки (linkage) и продолжительности хранения (storage duration).

Продолжительность хранения:
* Все переменные, определенные на уровне namespace, имеют статическую продолжительность хранения, т.е. живут вечно.
* Все переменные, определенные как static, имеют статическую продолжительность хранения, т.е. живут вечно.

Линковка:
* Переменные, объявленные на уровне namespace, могут иметь внешнюю или внутреннюю линковку (зависит от наличия static, extern, const и т.п.)
* Переменные, объявленные локально, вообще не имеют никакой линковки (и static тут ничего не меняет).
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
03.07.2019, 22:18
Цитата Сообщение от pcmax Посмотреть сообщение
extern int a; // тут я говорю линкувщику
Нет. Этим ты вводишь имя в текущую область видимости и говоришь компилятору, что такое имя есть, а определение в другом месте.
А линковщик всего этого добра вообще не видит.
0
 Аватар для pcmax
443 / 74 / 7
Регистрация: 29.01.2018
Сообщений: 1,274
04.07.2019, 08:09  [ТС]
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Переменные, объявленные локально, вообще не имеют никакой линковки (и static тут ничего не меняет).
static не меняет тип линковки у локальной переменной, да это так. и обратного я не говорил. static примененный к локальной переменной создаст такую же долговременную область памяти, как и у глобальной, но отличия между static local и static global будут в том ,что static local буде видель лишь в блоке , где он был создан. ну вот наверное ответ на вопросы.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.07.2019, 08:09
Помогаю со студенческими работами здесь

Non-static variable a cannot be referenced from a static context
non-static variable a cannot be referenced from a static context public class MyClass { private int a=2; private boolean...

non-static variable cannot be referenced from a static context
Здравствуйте, Пытаюсь создать запись в таблице MySQL c JFrame. Выдает ошибку non-static variable cannot be referenced from a static...

Не могу понять в чем дело,выдает ошибку [Warning] Unit1.pas(90): For loop control variable must be simple local variable
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,...

Исправить ошибку For loop control variable must be simple local variable
var q,s,n:integer; a:array of integer; i:integer; Form1: TForm1; implementation {$R *.dfm} procedure...

[Warning] Unit1.pas(132): For loop control variable must be simple local variable
Помогите пожалуйста! что я не так делаю? ошибки: Unit1.pas(174): For loop control variable must be simple local variable ...


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

Или воспользуйтесь поиском по форуму:
38
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение/ Перевод Сайт называется reddit: The Thinkpad X220 Tablet is the best budget school laptop period. Это. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru