C++问题-multiple definition of

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ReturningProdigal/article/details/79005054

原因如下


问题代码一:

namespace Request{
    enum RequestType {
        none=0,
        camera=1,
        screen=2,
        cmd=3,
        fileop,
        cameraData,
        screenData,
        cmdData,
        fileopData
    };

    char* RequestTypeKey[] = {
        "none", "camera", "screen", "cmd", "fileop",
        "cameraData", "screenData", "cmdData", "fileopData"
    };
}

此代码是定义的Tcp数据传输的数据协议时,作为公共的头文件存在。
编译出现错误:

error: multiple definition of `Request::RequestTypeKey'

解决办法
在指定 RequestTypeKey 变量为const类型,修改如下:

char* const RequestTypeKey[] = {
        "none", "camera", "screen", "cmd", "fileop",
        "cameraData", "screenData", "cmdData", "fileopData"
    };

原因:在 .h/头文件 中申明变量(全局、成员),不能直接初始化,只能在 .cpp 文件中赋值、初始化。

补充

ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]

解决方法:

const char* const RequestTypeKey[] = {
        "none", "camera", "screen", "cmd", "fileop",
        "cameraData", "screenData", "cmdData", "fileopData"
    };

问题代码一:

#ifndef PTCPSOCKET_H
#define PTCPSOCKET_H

#include <QObject>

class PTcpSocket : public QObject
{
    Q_OBJECT
private:
    static PTcpSocket* PSocket;
public:
    static PTcpSocket* GetInstance();
};
PTcpSocket* PTcpSocket::PSocket = 0;
#endif // PTCPSOCKET_H

此代码是实现单例模式
编译错误:

multiple definition of `PTcpSocket::PSocket'

解决办法
将PTcpSocket* PTcpSocket::PSocket = 0;放置到 .cpp文件中。在 .cpp 文件中初始化静态变量

原因:在.h文件中不能初始化静态变量

总结

当 在初始化变量(非常量)时,会报multiple definition of错误。注意:.h文件申明变量,在.cpp文件中初始化、赋值、实现。

猜你喜欢

转载自blog.csdn.net/ReturningProdigal/article/details/79005054