Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> переменные extern 
V
    Опции темы
MAKCim
Дата 30.3.2008, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(bsa @  30.3.2008,  13:25 Найти цитируемый пост)
MAKCim, ну и зачем оно нужно? 

а вопрос разве был в этом?  smile 
я лишь хотел оспорить тезис
Цитата(bsa @  30.3.2008,  11:36 Найти цитируемый пост)
если будет найдено более одной переменной, то тоже возникнет ошибка, так как непонятно, которую из них использовать. 


ps. хороший вопрос для теста, кстати


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
bsa
Дата 30.3.2008, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Вопрос может быть и хороший, но я, например, о __attribute__((weak)) вообще впервые слышу. Более того, мне даже сходу не удалось найти описание того, что это такое и тем более, зачем это может быть нужно.
PM   Вверх
MAKCim
Дата 30.3.2008, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



bsa, 
в этом примере weak вообще не имеет никакого смысла
это пример ради примера
Цитата(bsa @  30.3.2008,  13:32 Найти цитируемый пост)
зачем это может быть нужно. 

1. ядро
к примеру мы пишем модуль ядра и не знаем точно, экспортируется ли нужный нам символ, или нет
в зависимости от этой информации, мы можем строить код по-разному
если просто тупо использовать этот символ, то мы просто не сможем загрузить модуль, если символ не экспортируется
решение такое
Код

__attribute__((weak)) extern void do_debug(struct pt_regs*, unsigned long);
static void (*__do_debug)(struct pt_regs*, unsigned long) = &do_debug;

код загрузки модуля ядра сначала пытается найти идентификатор "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 сей трактат  smile 

Это сообщение отредактировал(а) MAKCim - 30.3.2008, 14:17


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
inside_pointer
Дата 30.3.2008, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 344
Регистрация: 9.3.2008

Репутация: 5
Всего: 12



Цитата(vinter)

каких локальных? в данном случае у тебя глобальная переменная, для которой в определенном месте выделяется память. Выделяется она 1 раз.

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

Цитата(vinter)

будет, глобальная видимость у всех связанных едениц трансляции одна.

Как она будет влиять на переменную в другом файле, если в другом файле не объявить наличие внешней переменной где-то, но использовать одноимённую ей там ?
Будет выдана ошибка о недоступности глобальной переменной ?


PM MAIL   Вверх
korian
Дата 30.3.2008, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

Репутация: 3
Всего: 17



тут я фигню сказал

Это сообщение отредактировал(а) korian - 30.3.2008, 14:28
PM   Вверх
korian
Дата 30.3.2008, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

Репутация: 3
Всего: 17



хотя все-таки не фигню.
Цитата(MAKCim @  30.3.2008,  12:01 Найти цитируемый пост)
вопрос, что будет выведено?

нормальный компилятор выдаст ошибку, при линковке такого кода (без __attribute__((weak)) - не знаю что оно дает)

Цитата(MAKCim @  30.3.2008,  12:27 Найти цитируемый пост)
ps. хороший вопрос для теста, кстати 

по поводу хорошести этого вопроса для теста...
теста для определения знания gcc - да.
только смысл в таком тесте? хотя варианты могут быть разные...
но имху тестировать лучше знание языка, чем знание компилятора.

Цитата(MAKCim @  30.3.2008,  12:27 Найти цитируемый пост)
я лишь хотел оспорить тезис

тезис не оспорен в стандерте C++...
а в стандарте конкретной реализации компилятора оспорить можно все что угодно.


Это сообщение отредактировал(а) korian - 30.3.2008, 14:51
PM   Вверх
MAKCim
Дата 30.3.2008, 20:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



korian, 
к копилятору тут имеет отношение только 
синтаксис определения атрибута  smile 


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
korian
Дата 30.3.2008, 23:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

Репутация: 3
Всего: 17



Цитата(MAKCim @  30.3.2008,  19:08 Найти цитируемый пост)
korian, 
к копилятору тут имеет отношение только 
синтаксис определения атрибута  

чего-то я наверно не понимаю...
такую констркцию можно записать средствами C++?
PM   Вверх
Alek86
Дата 31.3.2008, 09:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



Цитата(korian @  30.3.2008,  23:17 Найти цитируемый пост)
такую констркцию можно записать средствами C++?

нет, нельзя

и вообще не понимаю, в чем проблема тут - будет 2 глобальных переменных - то есть ошибка линковки. и что с того?
и при чем тут вообще extern?


--------------------
user posted image    user posted image
PM MAIL   Вверх
vinter
Дата 31.3.2008, 10:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



Цитата(inside_pointer @  30.3.2008,  15:20 Найти цитируемый пост)
В функции объявляются эти точки выхода на глобальные переменные, для чего они объявляются в функции? только для того чтобы если глобальные переменные определены ниже вызова этой функции или в другом файле относительно этой функции, функция могла их найти ?

да
Цитата(inside_pointer @  30.3.2008,  15:20 Найти цитируемый пост)
Как она будет влиять на переменную в другом файле, если в другом файле не объявить наличие внешней переменной где-то, но использовать одноимённую ей там ?

можно использовать одноименную локальную переменную, тогда она скороет имя глабальной, и заменит ее.
Цитата(inside_pointer @  30.3.2008,  15:20 Найти цитируемый пост)
Будет выдана ошибка о недоступности глобальной переменной ?

да, если переменная не определена, но декларирована extern'ом



--------------------
Мой блог
PM MAIL WWW   Вверх
inside_pointer
Дата 31.3.2008, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 344
Регистрация: 9.3.2008

Репутация: 5
Всего: 12



Цитата(vinter)

можно использовать одноименную локальную переменную

нет, я имел ввиду не это, я имел в виду, что переменную используем как глобальную(то есть просто к ней обращаемся)

Цитата(vinter)

да, если переменная не определена, но декларирована extern'ом


Но видимо обращение к глобальной переменной без объявления внешней переменной - это то же самое что обращение к глобальной переменной с объявлением её как внешней переменной.
По крайней мере в книжке у меня сложилось такое впечатление, потому что они говорят что объявления extern можно опускать если определения находятся выше обращений и это обычная практика - обращаться к глобальной переменной, не объявляя её как требует стандарт.

PM MAIL   Вверх
Alek86
Дата 31.3.2008, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



inside_pointer, проведи пару экспериментов

похоже ты совсем неверно понял, что такое глобальные переменные в разных модулях и слово extern


--------------------
user posted image    user posted image
PM MAIL   Вверх
vinter
Дата 31.3.2008, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



Цитата(inside_pointer @  31.3.2008,  13:33 Найти цитируемый пост)
По крайней мере в книжке у меня сложилось такое впечатление, потому что они говорят что объявления extern можно опускать если определения находятся выше обращений и это обычная практика - обращаться к глобальной переменной, не объявляя её как требует стандарт.

да, если определение находится в том же модуле. а если у тебя переменная определена в другом модуле, а ты хочешь юзать ее в этом? вот за этим и нужен extern. А вообще глобальные переменные это зло, старайся их избегать. 


--------------------
Мой блог
PM MAIL WWW   Вверх
MAKCim
Дата 31.3.2008, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(vinter @  31.3.2008,  12:50 Найти цитируемый пост)
А вообще глобальные переменные это зло, старайся их избегать.  

были уже топики на эту тему...
тупо следовать стереотипам - вот это зло



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
vinter
Дата 31.3.2008, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



MAKCim, я не говорю не юзай ГП никогда, я написал 
Цитата(vinter @  31.3.2008,  13:50 Найти цитируемый пост)
 старайся их избегать




--------------------
Мой блог
PM MAIL WWW   Вверх
Страницы: (4) Все 1 [2] 3 4 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0699 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.