【问题标题】:What does :: mean in front of a function call? [duplicate]:: 在函数调用前面是什么意思? [复制]
【发布时间】:2017-03-29 03:17:05
【问题描述】:
I2CDevice::I2CDevice(unsigned int bus, unsigned int device) {
    this->file=-1;
    this->bus = bus;
    this->device = device;
    this->open();
}

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;
}

以上是一段做Linux I2C接口的代码,我的问题就在这行:

this->file=::open(name.c_str(), O_RDWR)

我认为这是尝试使用 open() 函数为文件描述符 this->file 分配一个值。但是为什么会有一个“::”符号呢?为什么不只是“open()”。

【问题讨论】:

  • 我已经更新了标题和标签,因为这实际上与 open 具体无关,但如果您不同意,您可以撤消我的更改。
  • @immibis 已接受,谢谢!

标签: c++


【解决方案1】:

即 C++ 名称解析。 :: 运算符分隔命名空间。当它开始一个名称时,它是对顶级全局命名空间的显式引用。它在这里的使用保证了它引用的是 C 库声明的 open 函数,而不是恰好在类、当前命名空间或任何 using namespace 声明中的任何 open

在此特定示例中,::open 是必需的,因为它位于 open 类函数中。在这里简单地调用open 会导致名称解析错误,因为类中有open 但没有匹配的覆盖。如果参数 确实 匹配,这将是一个递归调用,这不是您想要的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-08
    • 1970-01-01
    • 2011-07-08
    • 1970-01-01
    • 1970-01-01
    • 2016-09-03
    相关资源
    最近更新 更多