Выполнить арифметику в макросе c - PullRequest
0 голосов
/ 25 июня 2018

При переносе библиотеки я столкнулся со следующей проблемой.Существует определение макроса с аппаратным эквивалентом -

#define PREFETCH(addr) HW_PREFETCH((const volatile void *)addr)

Мне нужно перенести другой макрос PREFETCH_ADDR_OFF (addr, offset) на HW_PREFETCH (addr).Я пытался следовать, но не работает.Есть ли способ выполнить арифметику в макросе c?

#define PREFETCH_ADDR_OFF(addr,offset) PREFETCH(addr+offset)

Ниже приведена ошибка компиляции:

указатель типа 'void *', используемый в арифметике

РЕДАКТИРОВАТЬ - вот что сработало для меня -

#define PREFETCH(addr) HW_PREFETCH(addr)
#define PREFETCH_ADDR_OFF(addr,offset) PREFETCH((((char*)addr)+offset))

Ответы [ 3 ]

0 голосов
/ 25 июня 2018

Как уже упоминалось, вы не можете делать арифметику указателей на void*, и это не имеет ничего общего с макросами, кроме стандарта Си и здравого смысла. Насколько большой void объект?

Поэтому вам придется привести к типу, который вы можете сделать арифметическим, переносимо:

#include <stdint.h>
#define PREFETCH_ADDR_OFF(addr,offset) PREFETCH( (uintptr_t)(addr) + (offset) )
0 голосов
/ 25 июня 2018

Насколько велики вещи, на которые ссылается смещение?Если они являются байтами, то вам нужно использовать (char *). Если они являются целыми числами, тогда используйте (int *).Арифметика указателя увеличивает указатель на величину, необходимую для того, чтобы перешагнуть через то, на что указывает указатель.Вы не можете использовать void *.Она не будет работать.(Void *) сообщает компилятору свой указатель общего назначения.(Void *) обычно приводится к указателю того типа, который вам нужен, прежде чем указатель можно будет использовать для доступа к данным или для арифметики указателей.

«Макросы» - это, в основном, просто подстановка текста.Если вы действительно застряли, вы можете использовать save-temps, чтобы увидеть файл после замены, но до его компиляции.

0 голосов
/ 25 июня 2018

Тип addr - это void*, и, как говорит компилятор, вы не можете выполнять математику на void*.

Используйте TypeCast, чтобы привести указатель к байтовому указателю, и выполните математические расчеты для этого. Результатом будет char*, который должен свободно конвертироваться в void*

#define PREFETCH_ADDR_OFF(addr,offset) PREFETCH((((char*)addr)+offset))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...