You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

开发C++ I2C驱动类时,如何指定调用同名的C标准库函数

问题:I2C驱动类中调用标准库write/read函数冲突的解决方法

我正在编写一个I2C驱动类Drv_i2c,该类包含read()和write()成员方法。现在遇到一个问题:在类的write()方法中需要调用<unistd.h>头文件中的标准write函数,但Qt Creator编译器默认会优先选择类自身的write()方法,而非标准库中的函数。read函数也存在同样的冲突问题。

我知道可以修改类成员函数的名称,但想知道有没有无需改名就能指定调用<unistd.h>中write/read函数的方法?

相关代码示例:

bool Drv_i2c::write(uint8_t p_i2c_address, uint8_t p_reg, const std::vector<uint8_t> 
&p_data)
{
    [...]

    /* Checking that all data has been written */
    if(write(this->s_fd_i2c, l_buffer, l_buf_length) != l_buf_length)
    {
        //  ERROR HANDLING: i2c transaction failed
        l_result = false;
    }
    [...]
}

解决方案

  • 使用全局作用域解析符:::直接在标准库函数前加上::,强制编译器调用全局命名空间中的版本,也就是<unistd.h>提供的系统调用函数。修改后的代码如下:
if(::write(this->s_fd_i2c, l_buffer, l_buf_length) != l_buf_length)
// 处理read函数冲突同理:::read(...)

这种方式简洁直接,编译器会跳过类成员函数的查找逻辑,直接调用全局的write/read函数。

  • 显式引入全局函数:可以在类成员函数内部通过using声明指定优先使用全局版本的函数,不过这种方式可读性不如第一种,仅作为备选方案:
bool Drv_i2c::write(uint8_t p_i2c_address, uint8_t p_reg, const std::vector<uint8_t> 
&p_data)
{
    using ::write; // 声明优先使用全局write函数
    [...]

    /* Checking that all data has been written */
    if(write(this->s_fd_i2c, l_buffer, l_buf_length) != l_buf_length)
    {
        //  ERROR HANDLING: i2c transaction failed
        l_result = false;
    }
    [...]
}

内容的提问来源于stack exchange,提问作者Lizzie49

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 23:15:40