Макрос Hexdump (C / C ++) - PullRequest
       4

Макрос Hexdump (C / C ++)

0 голосов
/ 19 марта 2011

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

#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 в шестнадцатеричном формате.Обратите внимание, что вы можете использовать мой макрос со значением l float, и он выдает правильное представление с прямым порядком байтов.Большинство обычных процедур шестнадцатеричного дампа распечатывает биты так, как они записаны в памяти, что явно зависит от порядкового номера.Мой плохой за то, что я не понял, что я имел в виду.

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

inline uint32_t tohex(float f) { 
  uint32_t* u = (uint32_t *)&f; return *u; 
}

Ответы [ 2 ]

6 голосов
/ 19 марта 2011

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

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

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

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

В общем, функция в этом случае намного лучше.

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

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

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

1 голос
/ 19 марта 2011

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

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

...