在Linux下,C++中与mmap等效的是什么?

4

如何在C++中实现等效的mmap功能?

我有以下代码:

LCDdata = mmap(NULL, iFrameBufferSize, PROT_READ | PROT_WRITE, MAP_FILE | MAP_SHARED, fb_fd, 0);

其中,LCDdataunsigned char 类型的指针,iFrameBufferSizeint 类型,fb_fdstatic int 类型。

我使用 ARM 的 g++ 工具链进行编译时,它给出以下错误信息。

error: invalid conversion from 'void*' to 'unsigned char*' [-fpermissive]

我应该如何使用与mmap等效的类型函数?

我应该包含哪个头文件?这条新行的语法将变成什么样?


2
你尝试过类型转换吗?LCDdata = (unsigned char*) mmap(NULL... - muru
1
你的问题不是mmap,而是你在错误地使用它(参数类型错误)。 - Michael Kohne
1
@steeldriver的建议更好(使用static_cast - muru
2个回答

5

C++中的等效写法是auto LCDdata = static_cast<unsigned char*>(mmap(...

在C++中,我们更喜欢在初始化变量时定义它们,因此我们通常不再需要指定类型。在这里,我们不需要再重复unsigned char*


1
只是为了补充答案。mmap返回一个void。C语言有一个更宽松的类型系统,允许将void隐式转换为任何其他指针类型。C++则更加严格类型化,只允许将void*显式转换为另一种指针类型。 - doron
1
@doron C语言没有更加宽松的类型系统;它基本上具有相同的类型系统,但是它具有从void *进行隐式转换的功能。 - M.M
1
@JayminD:这可能是因为您之前声明了“LCDdata”变量;您可以尝试删除该先前的声明。 - MSalters

2
C允许将void*分配给任何类型的指针而不需要强制转换。C++则不行。C程序员已经抱怨了很长时间(malloc是最常见的抱怨),但这不太可能改变。
解决方案是添加强制转换。如果源代码需要编译为C,则使用C风格的强制转换:
LCDdata = (unsigned char*)mmap(...);

否则使用C++转换。
LCDdata = static_cast<unsigned char*>(mmap(...));

如果你想要做更激烈的操作,你可以研究一下Boost Interprocess。这将为你提供RAII。

“可编译为C”不是一件事(好吧-在一些人的心目中可能是,但实际上不应该是)。你要么写C,要么写C ++。 - M.M
1
与普遍观点相反,C和C++是两种不同的语言。我不太喜欢Lua对这两者交集的称呼"clean C"(参见http://www.lua.org/manual/5.2/manual.html,第一段)。但是,人们为了使大量有效的C代码也能作为有效的C++代码而做出了很多努力。而且,有很多好的理由在某些时候通过C编译器运行相同的源文件,而在其他时候通过C++编译器运行。我不知道原帖作者是否想要这样做,所以我提出了如何做到这一点(以及如果他不想保持C兼容性的替代方法)。 - Max Lybbert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接