在函数调用前面是什么意思?

时间:2017-03-29 03:17:05

标签: c++

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-&gt;文件赋值。但为什么有一个“::”符号?为什么不只是“打开()”。

1 个答案:

答案 0 :(得分:2)

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

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