关于宏

时间:2009-12-07 08:54:49

标签: c macros

我可能知道使用下面的x-macro代码有什么问题

#define FILL_BUFF_1 (int *)(0x01, 0x02)
#define FILL_BUFF_2 (int *)(0x03, 0x04)

#define X(a,b)

#define LOOK_UP \
     X(0x13, FILL_BUFF_1), \
     X(0x14, FILL_BUFF_2)

#undef X

#define X(a,b) a
int pid_table[2] = {LOOK_UP};
#undef X

#define X(a,b) b

int *pid_buff_ptr[2] = {LOOK_UP};

void main(int argc, _TCHAR* argv[])
{
    printf("%d ", (pid_buff_ptr+0));  // displays 0x02

    printf("%d ", (pid_buff_ptr+1));  // displays 0x04

    printf("%d " ,*(pid_buff_ptr[0] + 1)); // doesnt work
}

如何使上述代码访问缓冲区中的其他元素?

2 个答案:

答案 0 :(得分:1)

(对此进行疯狂刺杀只是因为它已经在这里待了一段时间没有答案。)

在最后一行中,您似乎将值0x03解引用为指针 - 我怀疑您正在获取SIGSEGV?

pid_buff_ptr[0] == 0x02

所以

(pid_buff_ptr[0] + 1) == 0x03

所以

*(pid_buff_ptr[0] + 1)

将取消引用0x03作为指针。

答案 1 :(得分:0)

我不确定你究竟想要做什么,但如果我猜对了,你想让pid_buff_ptr变量包含一个int值数组,而不是int *数组1}}值。

如果是这种情况,则需要更改

#define FILL_BUFF_1 (int *)(0x01, 0x02)
#define FILL_BUFF_2 (int *)(0x03, 0x04)

#define FILL_BUFF_1 {0x01, 0x02}
#define FILL_BUFF_2 {0x03, 0x04}

更改以下内容:

int *pid_buff_ptr[2] = {LOOK_UP};

int pid_buff_ptr[][2] = {LOOK_UP};

要进行打印,您可以使用以下内容:

printf("%d ", pid_buff_ptr[0][1]);

当然,我可能是错的。

现在,还有其他一些意见:

  • 在使用#include <stdio.h>之前,您需要printf()
  • main()返回int
  • 由于main()返回int,您应该从中返回int。传统上,0意味着成功。
  • 我不知道_TCHAR是什么,但如果它不是别名,或#define char,则可能遇到麻烦。

即使进行了上述更改,我也不明白是否需要使用预处理器进行欺骗。你究竟想做什么?