C++ virtual 与 inline (无法解析的外部符号, 未知的#endif )
2018-02-01 18:14
936 查看
Mac 下的一套代码编译不报错,但在 windows 下编译时出错:无法解析的外部符号 或 未知的 #endif。 不同平台下的C++写法要求不同,所以必须严格按照C++标准写代码
SKpacketParser.h 如下
class SKPacketParser { public: SKPacketParser() {}; virtual ~SKPacketParser() {}; public: virtual int ParsePacket(char* data, int len); virtual inline int GetHeadLen(const char * data, int len); virtual inline int GetPacketLen(const char * data, int len); virtual inline bool CheckHead(const char * data, int len); }; #endif
解决办法:
内联函数(inline) 内联函数的目的是为了减少函数调用时间。它是把内联函数的函数体在编译器预处理的时候替换到函数调用处,这样代码运行到这里时候就不需要花时间去调用函数。但内联函数有个缺点是它会增加执行文件大小。所以如果不适当的使用内联函数会造成执行文件特别大。 而使用内联函数有以下几点需要注意: 头文件中不仅要包含inline函数的声明,还要包含inline函数的定义 编译器需要把inline函数体替换到函数调用处,所以编译器必须要知道inline函数的函数体是啥,所以要将inline函数的函数定义和函数声明一起写在头文件中,便与编译器查找替换。 可以在同一个项目的不同源文件内定义函数名相同,实现相同的inline函数 同一个inline函数可以多处声明和定义,但是必须要完全相同 定义在class声明内的成员函数默认是inline函数 虚函数(virtual) 虚函数是为了实现多态特性的。虚函数的调用只有在程序运行的时候才能知道到底调用的是哪个函数,其是有有如下几点需要注意: 类的构造函数不能是虚函数 构造函数是为了构造对象的,所以在调用构造函数时候必然知道是哪个对象调用了构造函数,所以构造函数不能为虚函数。 类的静态成员函数是虚函数 类的静态成员函数是该类共用的,与该类的对象无关,静态函数里没有this指针,所以不能为虚函数。 虚函数不能定义为内联函数的原因 inline是在编译器将函数类容替换到函数调用处,是静态编译的。而虚函数是动态调用的,在编译器并不知道需要调用的是父类还是子类的虚函数,所以不能够inline声明展开,所以编译器会忽略
相关文章推荐
- c++ inline 的位置不当导致的 无法解析的外部符号
- error LNK2001: 无法解析的外部符号 "public: virtual struct QMetaObject const * __thiscall
- LNK2001:无法解析的外部符号 "public: virtual struct CRuntimeClass *
- c++模板分离式编译时无法解析外部符号
- 无法解析的外部符号 "protected: virtual struct wxEventTable const * __thiscal
- c++中调用python脚本提示 error LNK2001: 无法解析的外部符号 __imp_Py_Initialize等错误的解决方法
- error LNK2019: 无法解析的外部符号 "public: virtual void * __thiscall
- C++中使用pthread.h头文件报错 - 无法解析的外部符号 __imp__pthread_create,该符号在函数 _main 中被引用
- 【C++】error LNK2019: 无法解析的外部符号 "public: void __thiscall
- error LNK2001: 无法解析的外部符号 "public: virtual struct QMetaObject const * __thiscall ****::metaObj
- C++——错误 error LNK2019: 无法解析的外部符号 _main,该符号在函数 ___tmainCRTStartup 中被引用
- C++中使用类模板时出现:“error LNK2019: 无法解析的外部符号”的解决办法
- c++ 链接mysql:error LNK2019: 无法解析的外部符号
- C++:无法解析的外部符号问题 与 头文件包含注意要点
- 无法解析的外部符号 "public: virtual struct CRuntimeClass
- C++使用static的错误:无法解析的外部符号、“static”不应在文件范围内定义的成员函数上使用
- error LNK2001: 无法解析的外部符号 "public: virtual long __stdcall CBaseFilter(转)
- 无法解析的外部符号 "public: virtual struct CRuntimeClass
- C++中使用pthread.h头文件报错 - 无法解析的外部符号 __imp__pthread_create,该符号在函数 _main 中被引用
- QT + VS2005 编译出现 error LNK2001: 无法解析的外部符号 "public: virtual struct QMetaObject const * __thiscall Widget::metaObject 错误