none
内联函数定义在Cpp文件中调用时报异常Unresolved external symbol RRS feed

  • 问题

  • 请教高手:

    内联函数定义在Cpp文件中,调用时报异常Unresolved external symbol,定义在.h头文件中就行, 为啥呀?

    环境: Win7, VS2010


    class C{
    private:
        string _name;
    public:
        C(string name) : _name(name){}

        void setName(const string name){
            _name = name;
        }
        string getName()const;
    };

    inline string C::getName() const{
        return _name;
    }

    • 已编辑 MTiancai 2012年4月11日 3:10 Improve information
    2012年4月10日 5:13

答案

  • MTiancai你好! 

    据我所知,内联函数有两种书写方式:
    1、如果其它模块里需要调用这个函数,建议把函数实现直接放在函数声明处。定义在类声明之中的成员函数将自动地成为内联函数,例如:

    class   A 
    { 
    public: 
          void   Foo(int   x,   int   y)   {   …   }   //   自动地成为内联函数 
    } 
    

    2、如果只在本模块内调用,可以考虑把函数定义放在CPP中。如下面代码所示:

    // a.h 
    class   A 
    { 
    public: 
    void   Foo(int   x,   int   y);   
    } 
    //a.cpp
    inline   void   A::Foo(int   x,   int   y) 
    { 
    … 
    } 

    内联函数在调用时必须已经实现,所以放在cpp里时,a.Foo(1,1)时,a才去连接Foo()的函数实现,
    这是此函数并没有实现,所以报错。如果放在a.h中实现是可以的。 例如下面代码所示:

    // a.h 
    class A 
    { 
    public: 
    void Foo(int x, int y); 
    }; 
    
    inline void A::Foo(int x,int y) 
    { 
    } 
    

    希望我的回复对你有所帮助!

    祝你好运!



    Helen Zhao [MSFT]
    MSDN Community Support | Feedback to us

    • 已标记为答案 MTiancai 2012年4月11日 5:58
    2012年4月11日 4:50

全部回复

  • 内联函数当然直接写在类里

    新浪微博http://weibo.com/xianglitian,欢迎围观

    2012年4月11日 0:50
  • 1).内联函数必须是和函数体申明在一起,才有效.
    2).在C++中,在类的内部定义了函数体的函数,被默认为是内联函数.
    使用内联函数时应注意以下几个问题:

    (1) 在一个文件中定义的内联函数不能在另一个文件中使用。它们通常放在头文件中共享。
    (2) 内联函数应该简洁,只有几个语句,如果语句较多,不适合于定义为内联函数。
    (3) 内联函数体中,不能有循环语句、if语句或switch语句,否则,函数定义时即使有inline关键字,编译器也会把该函数作为非内联函数处理。
    (4) 内联函数要在函数被调用之前声明。例如下面的代码将内联函数放在函数调用之后声明,不能起到预期的效果。

    Visual C++ enthusiast, like network programming and driver development. At present is being engaged in the WinCE/Windows Mobile platform embedded development.

    2012年4月11日 1:46
    版主
  • 写成getName这种形式是不是也行?
    2012年4月11日 3:12
  • 1).内联函数必须是和函数体申明在一起,才有效.

    这句不太明白,我这样写成算是内联么?

    class C{
        string _name;
    public:
        ...
        string getName()const;
    };

    inline string C::getName() const{
        return _name;
    }

    2012年4月11日 3:14
  • MTiancai你好! 

    据我所知,内联函数有两种书写方式:
    1、如果其它模块里需要调用这个函数,建议把函数实现直接放在函数声明处。定义在类声明之中的成员函数将自动地成为内联函数,例如:

    class   A 
    { 
    public: 
          void   Foo(int   x,   int   y)   {   …   }   //   自动地成为内联函数 
    } 
    

    2、如果只在本模块内调用,可以考虑把函数定义放在CPP中。如下面代码所示:

    // a.h 
    class   A 
    { 
    public: 
    void   Foo(int   x,   int   y);   
    } 
    //a.cpp
    inline   void   A::Foo(int   x,   int   y) 
    { 
    … 
    } 

    内联函数在调用时必须已经实现,所以放在cpp里时,a.Foo(1,1)时,a才去连接Foo()的函数实现,
    这是此函数并没有实现,所以报错。如果放在a.h中实现是可以的。 例如下面代码所示:

    // a.h 
    class A 
    { 
    public: 
    void Foo(int x, int y); 
    }; 
    
    inline void A::Foo(int x,int y) 
    { 
    } 
    

    希望我的回复对你有所帮助!

    祝你好运!



    Helen Zhao [MSFT]
    MSDN Community Support | Feedback to us

    • 已标记为答案 MTiancai 2012年4月11日 5:58
    2012年4月11日 4:50
  • a.h中

    #include "stdio.h"
    #include <Windows.h>
    #include <string>

    class C{
    public:
     C()
      :_name("asdf")
     {
     }
         std::string _name;
     public:
         std::string getName()const;
     };
     
    inline std::string C::getName() const{
         return _name;
     }

    test.cpp

    #include "stdio.h"
    #include <Windows.h>
    #include "a.h"

    int main()
    {
     C c;
     std::string str = c.getName();
     return 0;
    }

    VC2010中测试通过

    • 已建议为答案 Genrge 2012年4月13日 1:58
    2012年4月12日 1:57