На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
  
> inline , Как встроить фунцию-член(класса:)))))
    У меня не сложный, вроде, вопрос по встраивым функциям
    Есть ,например, такой вот код
    CODE
    //////////////////////////
    class.h:
    class A
    {
    public:
    void f();
    };
    //////////////////////////
    class.cpp:
    #include "Class.h"
    inline void A::f()
    {
    }
    /////////////////////////
    main.cpp:
    #include "class.h"
    int main(void)
    {
    A a;
    a.f();
    return 0;
    }

    На который компилятор(VisualC 6.0)говорит вот это
    main.obj : error LNK2001: unresolved external symbol "public: void __thiscall A::f(void)" (?f@A@@QAEXXZ)
    Debug/ClassTraining.exe : fatal error LNK1120: 1 unresolved externals
    Но если поставить перед inline void A::f() extern то код но откомпилирует,
    но вот так ругнётся:
    warning C4630: 'f' : 'extern' storage-class specifier illegal on member definition
    Как один из способов решения этой проблеммы- помещять определение функции в объявление класса.
    Можно как-то по-другому?
      CODE

      //////////////////////////
      class.h:
      class A
      {
      public:
      inline void f();
      };
      //////////////////////////
      class.cpp:
      #include "Class.h"
      void A::f()
      {
      }
      /////////////////////////
      main.cpp:
      #include "class.h"
      int main(void)
      {
      A a;
      a.f();
      return 0;
      }
        to .alex Точно так же ругаеться.
        А нотация inline void A::f() взята от великого Страуструпа.
          Мой VC6.0 не ругается ни на этот код:
          CODE

          class A
          {
          public:
          void f();
          };
          inline void A::f()
          {
          }
          int main(void)
          {
          A a;
          a.f();
          return 0;
          }

          ни на этот
          CODE

          class A
          {
          public:
          inline void f();
          };
          void A::f()
          {
          }
          int main(void)
          {
          A a;
          a.f();
          return 0;
          }
            Мой тоже.
            Но как только ты раскидаешь это по файлас то ругаться точно начнет. Если совсем точнее ты определяешь функцию отдельно от итерфейса каласса(другой еденице трансяции наверно), то тут то и возникают проблеммы.
              inline-функции-члены должны быть 1) определены в объявлении класса 2) присутствовать вместе с определением в каждом модуле, который их использует.

              Т.е., кроме как определить ее в самом классе, в .h-файле вариантов нет.
                Тогда доп вопрос. Почему при определении с extern код компилируеться?
                  Потому, что extern -- функция, к которой могут обратиться любые другие модули. И она оформлена уже не как inline-последовательность ассемблерных инструкций, а как настоящая функция, получающая управление по call и возвращающая по ret, и существующая во всем собранном прожекте в единственном екземпляре.
                    Ну что-то в этом роде я и думал(в смысле про компановку функции). Но не знал последствий (в смысле хрен встроеться). Спасибо за конкретний ответ.
                    0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                    0 пользователей:


                    Рейтинг@Mail.ru
                    [ Script execution time: 0,0250 ]   [ 16 queries used ]   [ Generated: 29.03.24, 07:14 GMT ]