Простой вопрос про static
, найти ответ не могу в книгах
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.217.140] |
|
|
| Страницы: (3) 1 [2] 3 все ( Перейти к последнему сообщению ) |
Простой вопрос про static
, найти ответ не могу в книгах
|
Сообщ.
#16
,
|
|
|
|
Не могут они иметь extern, поскольку extern используется только в объявлениях (declaration), а фунция (не прототип, а именно функция) - это определение (definition).
|
|
Сообщ.
#17
,
|
|
|
|
Цитата -Daemon- @ Не могут они иметь extern, поскольку extern используется только в объявлениях (declaration), а фунция (не прототип, а именно функция) - это определение (definition). и ? что, функция не может быть external linkage ? |
|
Сообщ.
#18
,
|
|
|
|
Sazabis объявление, но не определение
Добавлено Возможно я не правильно понял твою реплику. |
|
Сообщ.
#19
,
|
|
|
|
|
Сообщ.
#20
,
|
|
|
|
Цитата Hryak @ Зачем слова из контекста вырываешь? Перечитай сквотированное мной перед этими словами. значит не понял, и опять перечитал не понял )) Вопрос какой нибуть был вообще ? Цитата Hryak @ Написать nostatic int g;, что ли? написать extern int g; extern это проивоположность static. |
|
Сообщ.
#21
,
|
|
|
|
Цитата Sazabis @ Цитата Hryak @ Зачем слова из контекста вырываешь? Перечитай сквотированное мной перед этими словами. значит не понял, и опять перечитал не понял )) Вопрос какой нибуть был вообще ? Повторяю содержание первой части поста #7: <<<<<<<<<< Цитата polyglott @ Если объявляешь переменную вне функции без квалификаторов, то переменная поумолчанию делается статической. Без каких квалификаторов? А как её сделать нестатической тогда? Написать nostatic int g;, что ли? >>>>>>>>>> Во-первых, речь шла про переменные, а не функции. Во-вторых, extern вообще не при делах, т.к. определение не может содержать extern, про что тут уже говорили. В-третьих, я знаю, что функции по умолчанию имеют внешнюю линковку . |
|
Сообщ.
#22
,
|
|
|
|
Цитата Hryak @ определение не может содержать extern, про что тут уже говорили. |
|
Сообщ.
#23
,
|
|
|
|
Цитата LPBOY @ Цитата Hryak @ определение не может содержать extern, про что тут уже говорили. ![]() Цитата A declaration is a definition unless it declares a function without specifying the function's body (dcl.fct.def), it contains the extern specifier (dcl.stc) or a linkage-specification* |
|
Сообщ.
#24
,
|
|
|
|
Цитатка не до конца. Цитата A declaration is a definition unless it declares a function without specifying the function’s body (8.4), it contains the extern specifier (7.1.1) or a linkage-specification (7.5) and neither an initializer nor a function-body, ![]() ![]() extern int x = 1; // определение, компилится нормально extern int fn() // определение, компилится нормально { return 1; } |
|
Сообщ.
#25
,
|
|
|
|
Уболтали.
|
|
Сообщ.
#26
,
|
|
|
|
Цитата LPBOY @ extern int fn() // определение, компилится нормально Век живи, век учись... |
|
Сообщ.
#27
,
|
|
|
|
Цитата Hryak @ А как её сделать нестатической тогда? Написать nostatic int g;, что ли? >>>>>>>>>> Подумай! Как глобальная переменная может быть нестатической? Все глобальные переменные - статические. По отношению к глобальным переменным слово static приобретает просто иной смысл, чем по отношению к локальным |
|
Сообщ.
#28
,
|
|
|
|
Цитата gryz @ По отношению к глобальным переменным слово static приобретает просто иной смысл, чем по отношению к локальным Спасибо за просвещение, не знал этого. |
|
Сообщ.
#29
,
|
|
|
|
gryz тогда встречный вопрос по поводу линковки. Почему если в хедер файле объявить переменную и инклудить ее в две разные единицы трансляции - возникает ошибка линковщика. Если же прописать спецификатор static, т.е. явно указать способ линковки, - то ествественно ошибка исчезает.
|
|
Сообщ.
#30
,
|
|
|
|
Цитата -Daemon- @ gryz тогда встречный вопрос по поводу линковки. Почему если в хедер файле объявить переменную и инклудить ее в две разные единицы трансляции - возникает ошибка линковщика. Если же прописать спецификатор static, т.е. явно указать способ линковки, - то ествественно ошибка исчезает. Этот static никаким образом не относится к статику для локальных переменных и членов классов. static для глобальных переменных как раз и делает их уникальными для каждой единицы трансляции. Фактически в этом случае компилятор создает несколько независимых глобальных переменных по одной для каждой единицы трансляции |