На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
  
> attribute , опции компилятора
    наткнулся на такое
    ExpandedWrap disabled
      void f () __attribute__ ((weak, alias ("__f"))){
       
      }


    для чего это ? и как это помогает оптимизировать код ?, доку по gcc читал , но не понял
      Этот - никак не помогает.
        Этот атрибут просто создает еще одну ссылку на функцию __f (что-то вроде вставки в файл ассемблера строки "f equ __f", это если после него поставить ;).
        А в этом примере атрибут видимо просто игнорируется.
        Без особой нужды лучше им не пользоваться.
          Не игнорируется.
          f() объявляется слабым символом (weak) и синонимом __f() (alias).
          Если нигде в других файлах проекта (или в этом же файле) не будет определено функции с именем f() или __f() - будет использоваться текущая реализация, у которой эти атрибуты указаны.
          Если же будет определена другая функция f() или __f() - она перекроет текущую реализацию.
            Цитата cppasm @
            Не игнорируется.
            f() объявляется слабым символом (weak) и синонимом __f() (alias).
            Если нигде в других файлах проекта (или в этом же файле) не будет определено функции с именем f() или __f() - будет использоваться текущая реализация, у которой эти атрибуты указаны.
            Если же будет определена другая функция f() или __f() - она перекроет текущую реализацию.

            Так это скорей наследование, а что значит weak есть strong ??
            для чего нужен алиас на функцию ?
              cppasm, ну в этом-то примере f() сразу же переопределяется (там сразу после атрибута стоят фигурные скобки).
                Этот комбинация атрибутов предназначена для использования в библиотеках.

                Добавлено
                Цитата sergioK @
                для чего нужен алиас на функцию ?
                Например, чтобы определить функцию, имя которой не является допустимым по правилам C. Вроде декорированного имени C++ вида ?ROUNDS@blowfish@@0IB или @TAC@GetConnParam$qqrp26ConnParams
                  Цитата amk @
                  ну в этом-то примере f() сразу же переопределяется (там сразу после атрибута стоят фигурные скобки).

                  Нет. Фигурные скобки - это тело функции, которая и объявлена weak.
                  Т.е. если не будет других функций с тем же именем, будет использовано это тело.
                  Если будут другие функции с тем же именем, они перекроют эту реализацию.
                    А если они тоже будут weak?
                      Скорее всего будет ошибка сборки, я не проверял.
                      Обычные символы перекрывают weak, но на два одинаковых обычных или два одинаковых weak линкер ругаться будет при сборке.
                      1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                      0 пользователей:


                      Рейтинг@Mail.ru
                      [ Script execution time: 0.0703 ]   [ 15 queries used ]   [ Generated: 17.06.26, 21:08 GMT ]