Tôi thực sự có một số mã có thể làm những gì bạn muốn. Nó sử dụng bộ tiền xử lý để xâu chuỗi tên biến để cho phép bạn in nó ra. Nó đổ cả tên biến và giá trị (dựa trên kiểu) và bố trí bộ nhớ cho biến đó.Các chương trình sau đây cho thấy cách nó được thực hiện:
#include <stdio.h>
#include <stdlib.h>
static void dumpMem (unsigned char *p, unsigned int s) {
int i;
unsigned char c[0x10];
printf (">> ");
for (i = 0; i < 0x10; i++) printf (" +%x",i);
printf (" +");
for (i = 0; i < 0x10; i++) printf ("%x",i);
printf ("\n");
for (i = 0; i < ((s + 15) & 0xfff0); i++) {
if ((i % 0x10) == 0) {
if (i != 0) printf (" %*.*s\n", 0x10, 0x10, c);
printf (">> %04x ",i);
}
if (i < s) {
printf (" %02x", p[i]);
c[i & 0xf] = ((p[i] < 0x20) || (p[i] > 0x7e)) ? '.' : p[i];
} else {
printf (" ");
c[i & 0xf] = ' ';
}
}
printf (" %*.*s\n", 0x10, 0x10, c);
}
#define DUMPINT(x) do{printf("%s: %d\n",#x,x);dumpMem((char*)(&x),sizeof(int));}while(0)
#define DUMPSTR(x) do{printf("%s: %s\n",#x,x);dumpMem(x,strlen(x));}while(0)
#define DUMPMEM(x,s) do{printf("%s:\n",#x);dumpMem((char*)(&x),s);}while(0)
typedef struct {
char c;
int i;
char c2[6];
} tStruct;
int main (void) {
int i = 42;
char *s = "Hello there, my name is Pax!";
tStruct z;
z.c = 'a'; z.i = 42; strcpy (z.c2,"Hello");
DUMPINT (i);
DUMPSTR (s);
DUMPMEM (z,sizeof(z));
return 0;
}
này kết quả đầu ra:
i: 42
>> +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +a +b +c +d +e +fabcdef
>> 0000 2a 00 00 00 *...
s: Hello there, my name is Pax!
>> +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +a +b +c +d +e +fabcdef
>> 0000 48 65 6c 6c 6f 20 74 68 65 72 65 2c 20 6d 79 20 Hello there, my
>> 0010 6e 61 6d 65 20 69 73 20 50 61 78 21 name is Pax!
z:
>> +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +a +b +c +d +e +fabcdef
>> 0000 61 b6 16 61 2a 00 00 00 48 65 6c 6c 6f 00 0d 61 a..a*...Hello..a
Và, nếu bạn đang băn khoăn về sự tỉnh táo của do {...} while (0)
trong macro, đó là để cho phép nó để được đặt bất cứ nơi nào trong mã mà không cần phải lo lắng về việc liệu bạn có đủ niềng răng xung quanh nó hay không.
Đó là một ý tưởng tốt để làm những việc từ bên trong chương trình. Tạo ra một chuỗi các hằng số chuỗi, điều đó chắc chắn. –
Có lẽ bạn nên định nghĩa nó là 'DUMP (varname, format)' và sử dụng '"% s = "format" \ n "' trong 'fprintf', cho phép nó hoạt động trên nhiều kiểu:' DUMP (somestring, "% s") 'hoặc' DUMP (someint, "% d") '. – caf
Đây là cách thông thường xung quanh bản chất không nội tại của c. Như bạn có thể tưởng tượng, nó có giới hạn và bẫy của nó, nhưng nó là về tốt như bạn có thể làm mà không xây dựng thông dịch viên nội tâm của riêng bạn. – dmckee