![]() |
Модераторы: 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 , спасибо вам, ребята
тему пока не помечаю как закрытую |
|||
|
||||
slater |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 168 Регистрация: 20.11.2009 Репутация: -2 Всего: -4 |
ребята, с одной стороны, в сишном файле если определим функцию и глобальную переменную(область видимости - это сишный файл) с ключевым словом static, т.е. по сути, они будут только доступны в этом сишном файле.
вот, вопрос в том, могу ли я использовать это статические элементы в других сишных файлах например, в вики http://en.wikipedia.org/wiki/Static_variab...Class_Variables написано In the C programming language and its descendants, the term static variable has at least three separate meanings, each related to the semantics of C's static keyword: 1)Static global variables are declared as "static" at the top level of a source file. Such variables are not visible outside the source file ("file scope"), unlike variables declared as "extern". 2)Static local variables are declared inside a function, just like automatic local variables. They have the same scope as normal local variables, differing only in "storage duration": whatever values the function puts into static local variables during one call will still be present when the function is called again. 3)C++ has static member variables: in classes, member variables declared as "static" are class variables (as opposed to instance variables). и в чем будет отличие, например: file1.c int a; static int b; void foo1() {...} static void foo2() {...} file1.h extern int a; extern int b; extern void foo1(); extern void foo290; в чем будет разница при подключении этого хидера? пока я понял только то, что под статику будет выделяться места ровно столько, сколько мы подключим этот хидер. а в остальном, глобальная статика и просто глобальные элементы одинаковы. и еще хотел спросить, память будет выделяться при использовании файла 1 без его подключения в другие сишные файлы???? Это сообщение отредактировал(а) slater - 16.2.2010, 21:20 |
|||
|
||||
baldina |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
slater, зачем читать на на заборах? есть специализированные ресурсы по C/C++
а еще лучше - купи книжку и читай, там все это просто, доступно и с примерами. нет, не можешь. собственно для того и определяют, чтобы это было нельзя. есть понятие связывания (linkage) - внешнее (external) и внутреннее (internal). почитай про это. вообще,
это одновременно объявление и определение переменной.
это только объявление, что есть где-то такая переменная и мы ее здесь можем использовать. память выделяется только при определении. глобальные переменные и функции имеют внешнее связывание, к ним можно получить доступ из других единиц компиляции. посредством объявления extern. глобальные переменные и функции, объявленные с модификатором доступа static имеют внутреннее связывание, к ним нельзя получить доступ из других единиц компиляции, даже посредством объявления extern. ищи в алфавитном указателе книжки выделенные слова, читай, и будет тебе счастье. Добавлено через 9 минут и 31 секунду получим
Это сообщение отредактировал(а) baldina - 16.2.2010, 22:07 |
||||||
|
|||||||
slater |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 168 Регистрация: 20.11.2009 Репутация: -2 Всего: -4 |
baldina, спасибо за исчерпывающий ответ
посоветуйте книжечку пожалуйста, где про связывание хорошо расписано в примере выше, т.е.
объявления я делал как раз именно к сишному файлу. а перекрытие имен вы наверное подразумевали то, что где то еще доступны функции и переменные с такими же именами.....хотя я указал в хидере, что они находяться в соотв. сишном файле. или там без разницы, т.е. в хидере можно объявлять прототипы и переменные необязательно которые определены в соотв. сишнике? Это сообщение отредактировал(а) slater - 16.2.2010, 22:33 |
|||
|
||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
перекрытие в данном случае термин. ели есть несколько идентификаторов с одним именем, в конкретной точке доступен лишь один.
|
|||
|
||||
slater |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 168 Регистрация: 20.11.2009 Репутация: -2 Всего: -4 |
baldina, СПАСИБО!!!
|
|||
|
||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
книг полно, но конкретно не скажу, давно не приобретал. по С++ можно С.Прата почитать.
вообще хороший ресурс http://www.intuit.ru/ тут и лекции, и ссылки на литературу |
|||
|
||||
slater |
|
||||||||
Бывалый ![]() Профиль Группа: Участник Сообщений: 168 Регистрация: 20.11.2009 Репутация: -2 Всего: -4 |
ну никак что-то не получается включить статику в другие сишные файлы
static.c
main.c
Добавлено через 4 минуты и 17 секунд извиняюсь, компилируется, только вот не понимаю почему?????? объясните пожалуйста, нигде не могу найти хорошее описание |
||||||||
|
|||||||||
baldina |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
включаемые (.h) файлы включаются буквально. имеем
static.с
здесь объявлены внешние staticf и string, но определены и локальные (статические) staticf и string. которые нигде не используются. синтаксически все верно. практически - наличие или отсутствие этого файла на программу никак не влияет (умный линкер вообще его в программу не включит, т.к. нет экспортируемых имен) теперь main.c
тут тоже все синтаксически верно - объявлены внешние staticf и string, которые тут и используются. так что должно компилироваться. вот только линковаться не будет, т.к. в проекте нет определения глобальных staticf и string. |
||||
|
|||||
slater |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 168 Регистрация: 20.11.2009 Репутация: -2 Всего: -4 |
спасибо, но удивительно, программа все равно линкуется и выполняется, можете сами глянуть.
причем в майне string берется как раз из статики(из файла static.c) |
|||
|
||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
не должна она линковаться. если так - выкиньте свой компилятор и возьмите другой, правильный. |
|||
|
||||
slater |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 168 Регистрация: 20.11.2009 Репутация: -2 Всего: -4 |
gnu gcc
выкинуть?! ))))))))) |
|||
|
||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
gcc 4.1.2, естественно не линкует.
значит делаешь не то, что говоришь Добавлено через 2 минуты и 43 секунды
то же самое при линковке говорят MSVC 7.1 и 9.0 |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |