attribute
, опции компилятора
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.217.140] |
|
|
attribute
, опции компилятора
|
Сообщ.
#1
,
|
|
|
|
наткнулся на такое
![]() ![]() void f () __attribute__ ((weak, alias ("__f"))){ } для чего это ? и как это помогает оптимизировать код ?, доку по gcc читал , но не понял |
|
Сообщ.
#2
,
|
|
|
|
Этот - никак не помогает.
|
|
Сообщ.
#3
,
|
|
|
|
Этот атрибут просто создает еще одну ссылку на функцию __f (что-то вроде вставки в файл ассемблера строки "f equ __f", это если после него поставить
.А в этом примере атрибут видимо просто игнорируется. Без особой нужды лучше им не пользоваться. |
|
Сообщ.
#4
,
|
|
|
|
Не игнорируется.
f() объявляется слабым символом (weak) и синонимом __f() (alias). Если нигде в других файлах проекта (или в этом же файле) не будет определено функции с именем f() или __f() - будет использоваться текущая реализация, у которой эти атрибуты указаны. Если же будет определена другая функция f() или __f() - она перекроет текущую реализацию. |
|
Сообщ.
#5
,
|
|
|
|
Цитата cppasm @ Не игнорируется. f() объявляется слабым символом (weak) и синонимом __f() (alias). Если нигде в других файлах проекта (или в этом же файле) не будет определено функции с именем f() или __f() - будет использоваться текущая реализация, у которой эти атрибуты указаны. Если же будет определена другая функция f() или __f() - она перекроет текущую реализацию. Так это скорей наследование, а что значит weak есть strong ?? для чего нужен алиас на функцию ? |
|
Сообщ.
#6
,
|
|
|
|
cppasm, ну в этом-то примере f() сразу же переопределяется (там сразу после атрибута стоят фигурные скобки).
|
|
Сообщ.
#7
,
|
|
|
|
Этот комбинация атрибутов предназначена для использования в библиотеках.
Добавлено Цитата sergioK @ Например, чтобы определить функцию, имя которой не является допустимым по правилам C. Вроде декорированного имени C++ вида ?ROUNDS@blowfish@@0IB или @TAC@GetConnParam$qqrp26ConnParams для чего нужен алиас на функцию ? |
|
Сообщ.
#8
,
|
|
|
|
Цитата amk @ ну в этом-то примере f() сразу же переопределяется (там сразу после атрибута стоят фигурные скобки). Нет. Фигурные скобки - это тело функции, которая и объявлена weak. Т.е. если не будет других функций с тем же именем, будет использовано это тело. Если будут другие функции с тем же именем, они перекроют эту реализацию. |
|
Сообщ.
#9
,
|
|
|
|
А если они тоже будут weak?
|
|
Сообщ.
#10
,
|
|
|
|
Скорее всего будет ошибка сборки, я не проверял.
Обычные символы перекрывают weak, но на два одинаковых обычных или два одинаковых weak линкер ругаться будет при сборке. |