Вопрос

У меня есть работающая функция шестнадца лет, но она, кажется, излишна для печати одной переменной. Так что я пытаюсь сделать макрос для этого. Пока это работает почти идеально:

#define PRINT_FMT2(val,des,fmt) printf(#des" = "fmt": "SRC_STRN,val)
// SRC_STRN is a macro that evals to string literal containing file and line# 

#include <stdint.h>
#define PRINT_HEX(x) PRINT_FMT2((*((uint32_t*)(&(x)))),x,"%x") 
// the lack of parens around 2nd arg to PRINT_FMT2 is okay cause it gets #'d

Единственная проблема в этом заключается в том, что я не могу использовать его с возвращающимся значением функции. Я получаю ошибку lvalue required as unary '&' operand. Анкет Я думаю, что это означает, что я не могу использовать этот метод подсчета PTR в Uint-PTR. Есть ли еще один эффективный способ сделать это?

Редактировать: Я хотел бы упомянуть, что большинство людей скрывали, что я хотел увидеть свою ценность, сохранившуюся и преобразованную в неподписанный INT Hexadecimal Format. Обратите внимание, что вы можете использовать мой макрос с помощью L-значения float И это выплевывает правильное представление с большим эндианским. Большинство регулярных процедур шестигранника будут распечатывать биты, как это написано в памяти, что явно зависит от эндзианности. У меня плохое из -за того, что я не понял, что я имел в виду.

В любом случае, я закончил тем, что написал набор перегруженных функций, которые можно использовать с R-значением. В конце концов я действительно просто хотел использовать его на 32-разрядных поплавках.

inline uint32_t tohex(float f) { 
  uint32_t* u = (uint32_t *)&f; return *u; 
}
Это было полезно?

Решение

Макросы следует использовать экономно, потому что они склонны к ошибкам, и их трудно отлаживать.

В этом случае вы не получите никакой выгоды от использования макроса, потому что такая короткая функция, вероятно, будет вставлена.

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

Это также будет легче написать.

В целом, функция - гораздо лучший выбор в этом случае.

Кроме того, в языке уже встроены функции, чтобы делать то, что вы пытаетесь сделать, как в C ++, так и в C (если вам нужна скорость).

Редактировать

Если вы действительно хотите выяснить, как сделать это макросом, и хотите знать, почему это не работает, посмотрите на ответ Даппавита.

Другие советы

В сообщении об ошибке говорится, что вы не можете взять адрес возвращаемого значения, потому что это не значение L. Чтобы взять адрес, вам нужен объект, у которого на самом деле есть адрес. Такие объекты могут отображаться в левом размере назначения, следовательно, термин L-значение.

Функциональный вызов не может появиться слева от назначения-возвращаемое значение нет L-значение. Вот почему вы получаете ошибку. В C не имеет смысла принимать адрес возвратной стоимости. (В C ++ вы можете вернуть ссылки. В этом случае вы Можно Возьмите адрес обратной стоимости. Однако другие возвращаемые значения имеют те же ограничения, что и в C-они не являются L-значениями.)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top