Как обойтись без передачи адреса целочисленного литерала функции? - PullRequest
0 голосов
/ 21 июня 2020

Итак, у меня есть файл заголовка, который определяет все константы / адреса регистров, используемых в проекте, и у меня есть функция, которая принимает указатель на данные, но вы не можете передать ссылку на целочисленный литерал, поскольку он значение. Есть ли способ лучше?

#define REG_A   (uint8_t) 0x3

void transmit_data(uint8_t *p) {
 //...
}

int main(void) {
  uint8_t arr[2] = {0xab, 0xca};
  
  transmit_data(arr);
  transmit_data(&REG_A); // won't work since it's an value but that's what i'm trying to achieve

}

Ответы [ 2 ]

2 голосов
/ 21 июня 2020

Вы можете использовать составной литерал для создания объекта на лету:

transmit_data(& (uint8_t) {REG_A});

Конструкция ( type ) { значение } создает объект с типом тип и значением значение .

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

transmit_data((uint8_t []) {REG_A});
0 голосов
/ 21 июня 2020

Не использовать макросы?

В шапке:

extern uint8_t REG_A;

В одном из исходных файлов:

uint8_t REG_A = 0x3;

Тогда можно передать адрес к вашей функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...