【问题标题】:What does ::open mean?::open 是什么意思?
【发布时间】:2022-06-22 23:49:22
【问题描述】:

我需要帮助理解 C++ 语法。我指的是 Derek Molloy Github

/Chp08/i2c/cpp/I2CDevice.cpp

在他的实现文件中,他的代码中有这个部分

int I2CDevice::open(){
   string name;
   if(this->bus==0) name = BBB_I2C_0;
   else name = BBB_I2C_1;

   if((this->file=::open(name.c_str(), O_RDWR)) < 0){
      perror("I2C: failed to open the bus\n");
      return 1;
   }
   if(ioctl(this->file, I2C_SLAVE, this->device) < 0){
      perror("I2C: Failed to connect to the device\n");
      return 1;
   }
   return 0;
}

我对这一行感到困惑, if((this-&gt;file=::open(name.c_str(), O_RDWR)) &lt; 0)=::open 到底是什么意思?我知道 C++ 中的 fstream 库有一个 open 方法,但为什么要包含 ::

【问题讨论】:

  • ::open 表示“使用全局命名空间中的open 函数”。
  • ^ 并且不要递归调用int I2CDevice::open()
  • 既然他的方法也是“开放的”,包括 :: 有助于防止 fstream 库中的标准开放方法和他的方法之间的任何混淆?只要确保我理解你的回复@Elijay。
  • 谢谢!我非常感谢你们的帮助。

标签: c++ syntax fstream


【解决方案1】:

name::func() 表示在命名空间“name”下调用inc func。一些函数比如 open 是在没有名字的全局命名空间中定义的,所以 ::open 从全局命名空间调用一个名为 open 的函数。这里使用它来避免调用 I2CDevice::open 并显式调用操作系统的 open 函数。

【讨论】:

    【解决方案2】:

    在进行函数调用时,您可以在函数前面加上它所在的命名空间:

    <NameSpaceDecl>::<Function>(<Param>);
    

    这通常看起来像这样:

    std::sort(begin, end);
    

    但是全局命名空间中的东西,可以被较短的::访问

    ::open(<Stuff>);
    

    因此,当编译器可能从本地范围中选择了一个函数时,这是一种指定特定函数的方法。

    在您的情况下,您可能需要使用::open(),因为您的类具有函数I2CDevice::open(),并且编译器会尝试使用该函数(并产生错误)。但是,通过具体使用 ::open(),您是说使用全局命名空间中的 open() 版本。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-26
      • 1970-01-01
      • 1970-01-01
      • 2011-08-12
      • 2017-06-11
      • 2018-03-05
      • 2023-03-27
      相关资源
      最近更新 更多