![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
а вопрос разве был в этом? я лишь хотел оспорить тезис
ps. хороший вопрос для теста, кстати -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
Вопрос может быть и хороший, но я, например, о __attribute__((weak)) вообще впервые слышу. Более того, мне даже сходу не удалось найти описание того, что это такое и тем более, зачем это может быть нужно.
|
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
bsa,
в этом примере weak вообще не имеет никакого смысла это пример ради примера 1. ядро к примеру мы пишем модуль ядра и не знаем точно, экспортируется ли нужный нам символ, или нет в зависимости от этой информации, мы можем строить код по-разному если просто тупо использовать этот символ, то мы просто не сможем загрузить модуль, если символ не экспортируется решение такое
код загрузки модуля ядра сначала пытается найти идентификатор "do_debug" в таблице экспортируемых символов ядра если ничего не найдено, проверяется атрибут символа (из соответствующего элемента таблицы символов модуля) если атрибут WEAK не установлен, то возвращается ошибка и модуль не загружается иначе - значение символа (его адрес) устанавливается в 0 и callback __do_debug будет равен 0 в самом коде ядра на этапе инициализации проверяется __do_debug 2. glibc все malloc-хуки основаны на атрибуте WEAK см. man __malloc_hook если вкратце, он используется для возможности переопределения используемой динамической библиотекой функциональности например, в GLIBC определен WEAK символ __malloc_initialize_hook (в виде указателя на функцию) при инициализации аллокатора malloc(), идет вызов функции по адресу __malloc_initialize_hook по-умолчанию __malloc_initialize_hook содержит адрес дефолтной функции инициализации, которая инициализирует WEAK символ __malloc_hook, содержащий адрес функции, на которую передается управление после вызова malloc() мы можем переопределить __malloc_initialize_hook в своем коде и при инициализации аллокатора, соответствующая функция будет вызвана если бы у __malloc_initialize_hook не было атрибута WEAK, то на этапе динамической компоновки возникла бы ошибка двойного определения __malloc_initialize_hook (в коде программы, и в коде библиотеке) прямо можно в FAQ сей трактат Это сообщение отредактировал(а) MAKCim - 30.3.2008, 14:17 -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| inside_pointer |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 344 Регистрация: 9.3.2008 Репутация: 5 Всего: 12 |
В функции объявляются эти точки выхода на глобальные переменные, для чего они объявляются в функции? только для того чтобы если глобальные переменные определены ниже вызова этой функции или в другом файле относительно этой функции, функция могла их найти ?
Как она будет влиять на переменную в другом файле, если в другом файле не объявить наличие внешней переменной где-то, но использовать одноимённую ей там ? Будет выдана ошибка о недоступности глобальной переменной ? |
||||
|
|||||
| korian |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 651 Регистрация: 8.3.2008 Где: Украина, Харьков Репутация: 3 Всего: 17 |
тут я фигню сказал
Это сообщение отредактировал(а) korian - 30.3.2008, 14:28 |
|||
|
||||
| korian |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 651 Регистрация: 8.3.2008 Где: Украина, Харьков Репутация: 3 Всего: 17 |
хотя все-таки не фигню.
нормальный компилятор выдаст ошибку, при линковке такого кода (без __attribute__((weak)) - не знаю что оно дает) по поводу хорошести этого вопроса для теста... теста для определения знания gcc - да. только смысл в таком тесте? хотя варианты могут быть разные... но имху тестировать лучше знание языка, чем знание компилятора. тезис не оспорен в стандерте C++... а в стандарте конкретной реализации компилятора оспорить можно все что угодно. Это сообщение отредактировал(а) korian - 30.3.2008, 14:51 |
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
korian,
к копилятору тут имеет отношение только синтаксис определения атрибута -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| korian |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 651 Регистрация: 8.3.2008 Где: Украина, Харьков Репутация: 3 Всего: 17 |
||||
|
||||
| Alek86 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
нет, нельзя и вообще не понимаю, в чем проблема тут - будет 2 глобальных переменных - то есть ошибка линковки. и что с того? и при чем тут вообще extern? |
|||
|
||||
| vinter |
|
||||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
да
можно использовать одноименную локальную переменную, тогда она скороет имя глабальной, и заменит ее.
да, если переменная не определена, но декларирована extern'ом |
||||
|
|||||
| inside_pointer |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 344 Регистрация: 9.3.2008 Репутация: 5 Всего: 12 |
нет, я имел ввиду не это, я имел в виду, что переменную используем как глобальную(то есть просто к ней обращаемся)
Но видимо обращение к глобальной переменной без объявления внешней переменной - это то же самое что обращение к глобальной переменной с объявлением её как внешней переменной. По крайней мере в книжке у меня сложилось такое впечатление, потому что они говорят что объявления extern можно опускать если определения находятся выше обращений и это обычная практика - обращаться к глобальной переменной, не объявляя её как требует стандарт. |
||||
|
|||||
| Alek86 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
inside_pointer, проведи пару экспериментов
похоже ты совсем неверно понял, что такое глобальные переменные в разных модулях и слово extern |
|||
|
||||
| vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
да, если определение находится в том же модуле. а если у тебя переменная определена в другом модуле, а ты хочешь юзать ее в этом? вот за этим и нужен extern. А вообще глобальные переменные это зло, старайся их избегать. |
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
были уже топики на эту тему... тупо следовать стереотипам - вот это зло -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
MAKCim, я не говорю не юзай ГП никогда, я написал
|
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |