c++ 之 错误: ‘struct termios’重定义

文章描述了一个在C++编程中遇到的编译错误,当包含XAG_SerialPort.h头文件在.h文件内时,导致了structtermios的重定义问题。错误源于不同的库文件对同一结构体的定义。通过将头文件移至.cpp文件中,以及尝试使用#ifndef或#pragmaonce防止重复包含,问题仍未解决。最终,作者通过调整命名空间和结构体的包含位置解决了冲突。
摘要由CSDN通过智能技术生成

遇到重定义的编译错误,把 #include "SerialPort.h" 放在.cpp文件里就正常编译,放进.h文件就编译报重定义;

In file included from /opt/RV1126/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/arm-linux-gnueabihf/libc/usr/include/asm/termbits.h:1,
                 from /home/ac/work/SerialPort.h:14,
                 from /home/ac/work/BluetoothTransparentModule_Impl.h:23,
/opt/RV1126/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/arm-linux-gnueabihf/libc/usr/include/asm-generic/termbits.h:12:8: 错误: ‘struct termios’重定义
 struct termios {
        ^~~~~~~


In file included from /opt/RV1126/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/arm-linux-gnueabihf/libc/usr/include/termios.h:39,
                 from /home/ac/work/ThirdPartyLib/boost/include/boost/asio/serial_port_base.hpp:25,
                 from /home/ac/work/ThirdPartyLib/boost/include/boost/asio/basic_serial_port.hpp:34,
                 from /home/ac/work/ThirdPartyLib/boost/include/boost/asio.hpp:34,
/opt/RV1126/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/arm-linux-gnueabihf/libc/usr/include/bits/termios.h:28:8: 附注: previous definition of ‘struct termios’
 struct termios
        ^~~~~~~

报错时的.h文件写法:

#include "BluetoothTransparentModule.h"
#include "SerialPort.h"

namespace bluetoothtransparent {

class BluetoothTransparentModule_Impl : public BluetoothTransparentModule {
 public:
    BluetoothTransparentModule_Impl();
    virtual ~BluetoothTransparentModule_Impl();

    bool Init(void) override;
    bool Uninit(void) override;

 private:

    kapok_hardware::SerialPort sdev;

};
}    /* namespace bluetoothtransparent */

解决办法把.h修改为:

#include "BluetoothTransparentModule.h"

namespace hardware {
    class SerialPort;
}

namespace bluetoothtransparent {

class BluetoothTransparentModule_Impl : public BluetoothTransparentModule {
 public:
    BluetoothTransparentModule_Impl();
    virtual ~BluetoothTransparentModule_Impl();

    bool Init(void) override;
    bool Uninit(void) override;

 private:
    hardware::SerialPort *sdev;
};
}    /* namespace bluetoothtransparent */

把#include "SerialPort.h"从.h文件里删除,在.cpp文件里包含#include "SerialPort.h"。

重定义的问题,可用 #ifndef FileName_H_ ,或者 #pragma once来处理,也可以把重定义的文件的struct、变量名、常量,提出到一个公共的.h文件中,这三种方法都试过了,不行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值