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 分配一个值。但是为什么有一个“::”符号?为什么不只是“打开()”。
那就是 C++ 名称解析。该::
运营商分离的命名空间。当它开始一个名称时,它是对顶级全局命名空间的显式引用。它在这里的使用保证它引用的是open
由 C 库声明的函数,而不是任何open
碰巧在类、当前命名空间或任何using namespace
声明中的函数。
在这个特定的例子中,::open
是必需的,因为它在一个open
类函数中。简单地调用open
这里会导致名称解析错误,因为类中有一个open
但没有匹配的覆盖。如果参数确实匹配,这将是一个递归调用,这不是您想要的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句