![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
slater |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 168 Регистрация: 20.11.2009 Репутация: -2 Всего: -4 |
помогите разобраться с static & extern & volitale (чистый язык Си)
где и когда используется(все случаи использования) и зачем и почему привидите пример с хидером и сишным файлом |
|||
|
||||
17dufa |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 324 Регистрация: 2.3.2006 Репутация: 3 Всего: 5 |
||||
|
||||
slater |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 168 Регистрация: 20.11.2009 Репутация: -2 Всего: -4 |
читал, хотелось бы примеров, глубже понять отличие статики(и функций и переменных) от глобальных и пример хидера и сишника
|
|||
|
||||
MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
extern - в прототипах функций в интерфейсных *.h файлах
static - для ограничения области использования границами *.c файла (или функции в рамках *.c файла) или для защиты от double definition при использовании inline (c99) volatile - для доступа к совместно используемым данным -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
slater |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 168 Регистрация: 20.11.2009 Репутация: -2 Всего: -4 |
MAKCim,
![]() не до конца понятно, extern применяется и в прототипах функций в интерфейсных *.h файлах и для переменных? static в прототипах не используется? только при определении перменных и функций? что значит совместно совместно используемые данные? между кем используются? |
|||
|
||||
17dufa |
|
||||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 324 Регистрация: 2.3.2006 Репутация: 3 Всего: 5 |
slater, extern и для переменных
1.cpp:
1.h:
2.cpp:
|
||||||
|
|||||||
slater |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 168 Регистрация: 20.11.2009 Репутация: -2 Всего: -4 |
да, с extern я разобрался, осталось со статикой и валитейлом
|
|||
|
||||
Alca |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 7 Всего: 50 |
||||
|
||||
MAKCim |
|
||||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
классический пример
из-за возможных оптимизаций thread2 на k-ой итерации может не "увидеть" изменений value из thread1 Добавлено через 37 секунд да, естественно -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
||||
|
|||||
baldina |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
переменная, объявленная как static вне функции имеет внутреннее связывание. т.е. компилятор не создает для нее внешней ссылки и линкер ничего о ней не знает. таким образом область видимости такой переменной ограничена своей единицей компиляции, т.е. .cpp файлом, в котором она объявлена (от объявления и ниже).
если поместить объявление такой переменной в заголовок, включаемый в несколько файлов (единиц компиляции), то в результате получим несколько разных переменных. это же касается static функций - они видны только в своей единице компиляции. переменная, объявленная как static внутри функции имеет, в отличие от прочих локальных переменных, глобальное время жизни (т.е. ее значение сохраняется между вызовами функции. например
выведет
объявляя переменную, как volatile, мы сообщаем компилятору, что её значение может измениться в произвольный момент времени. это значит, что компилятор не будет применять к этой переменной оптимизацию и вообще делать каких-либо выводов о её возможном текущем значении. т.е. компилятор не будет размещать переменную в регистре и т.п., а будет добросовестно читать/писать её значение из/в ячейку памяти при каждом обращении. обычно используется в многопоточных приложениях, когда два потока работают с одними данными. |
||||
|
|||||
slater |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 168 Регистрация: 20.11.2009 Репутация: -2 Всего: -4 |
т.е. нада:
static volitale int value; ??????? а кроме области видимости у статики есть еще какой смысл? |
|||
|
||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
ну если нада, то нада ![]() только
volitale vs volatile Добавлено через 1 минуту и 35 секунд volatile - непостоянный, изменчивый; неуловимый, переменный Добавлено через 5 минут и 42 секунды время жизни глобальное. статические переменные размещаются в сегменте данных. если статическая переменная объявлена внутри функции, гарантируется, что она будет проинициализирована начальным значением до первого использования. |
|||
|
||||
MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
предотвращает double definition inline функций, определенных в *.h файлах -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
Леопольд |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
Alca, очень полезная статья, спасибо за ссылку!
-------------------- вопросов больше чем ответов |
|||
|
||||
slater |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 168 Регистрация: 20.11.2009 Репутация: -2 Всего: -4 |
MAKCim,baldina,Alca,17dufa , спасибо вам, ребята
тему пока не помечаю как закрытую |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |