2014-12-26 4 views
2

Что эквивалентно mmap в C++?Что эквивалентно mmap в C++ для linux?

У меня есть код, как показано ниже

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

Где LCDdataunsigned char является типом pointer, iFrameBufferSize является int типа и fb_fd является static int типом.

Когда я скомпилировать его с помощью рычага цепи g++ инструмента он дает мне ошибку, как показано ниже

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

Так как я могу использовать любую эквивалентную функцию типа вместо mmap?

Какой заголовочный файл я должен включить? И как этот синтаксис новой строки станет?

+2

Вы пробовали припечатывать его? 'LCDdata = (unsigned char *) mmap (NULL ...' – muru

+1

Ваша проблема не в mmap, ваша проблема в том, что вы используете ее неправильно (тип аргументов неверен). –

+1

@ предложение steeldriver лучше (используя ' static_cast') – muru

ответ

3

C++ эквивалент auto LCDdata = static_cast<unsigned char*>(mmap(...

В C++ мы предпочитаем, чтобы определить из переменных только тогда, когда мы их инициализации, и из-за того, что мы часто не нужно больше, чтобы указать тип. Здесь нам не нужно повторять unsigned char*.

+1

Просто добавьте ответ. mmap возвращает void *. C имеет более расслабленную систему типов и позволяет неявное литье void * на любой другой тип указателя. C++ более строго типизирован и будет допускать только явное литье void * к другому типу указателя. – doron

+1

@doron C не имеет более расслабленной системы типов, она имеет систему в основном одного и того же типа, но имеет неявное преобразование из 'void *'. –

+1

@JayminD: Вероятно, это потому, что вы объявили ' LCDdata' раньше, вы можете удалить это предыдущее объявление. – MSalters

2

C позволяет void* назначаться указателям любого типа без литья. C++ - нет. Программисты C жаловались на это целую вечность (malloc - самая распространенная жалоба), но это вряд ли изменится.

Решение состоит в том, чтобы добавить литье. Если источник должен быть скомпилирован как С, использовать приведение в стиле С:

LCDdata = (unsigned char*)mmap(...); 

В противном случае использовать в C++ ввергнуть

LCDdata = static_cast<unsigned char*>(mmap(...)); 

Если вы хотите сделать что-то более радикальное, вы можете посмотреть в Boost Interprocess , Это даст вам RAII.

+0

«Скомпилированный как C» - это не вещь (ну, это не должно быть, но, к сожалению, это в нескольких умах). Либо вы пишете C или вы пишете C++. –

+0

Вопреки распространенному мнению, C и C++ являются отдельными языками. Я не поклонник Lua «чистого C» имени для пересечения двух (http://www.lua.org/manual/5.2/manual.html, первый абзац). Но было сделано много усилий, чтобы сделать много действительного кода C также действительным кодом C++. И есть веские причины запускать один и тот же исходный файл через компилятор C иногда и компилятор C++ в другое время. Я не знаю, хочет ли оригинальный плакат сделать это, поэтому я рассказываю, как (и альтернативы, если он не хочет поддерживать совместимость C). –

Смежные вопросы