我有以下函数,我正在尝试将其转换为宏。
void hex_display(void const *v_ptr, int num)
{
uchar const *ptr = v_ptr;
int i;
for (i=0; i<num; i++)
{
if(i != 0)
{
if(((i%4) == 0) && ((i%16) != 0))
{
fprintf(fp, "\t");
}
if((i%16) == 0)
fprintf(fp, "\n");
fprintf(fp, "%02x", ptr[i]);
}
else
fprintf(fp, "%02x", ptr[i]);
}
fprintf(fp, "\n");
}
当我尝试将其转换为如下宏时,编译错误如宏参数必须以逗号分隔,“*”可能不会出现在宏参数列表中,这些错误出现在第一行。不确定如何解决这个问题。
#define hex_display(void const *v_ptr, int num)\
{\
uchar const *ptr = v_ptr;\
int i;\
for (i=0; i<num; i++)\
{\
if(i != 0)\
{\
if(((i%4) == 0) && ((i%16) != 0))\
{\
fprintf(fp, "\t");\
}\
if((i%16) == 0)\
fprintf(fp, "\n");\
fprintf(fp, "%02x", ptr[i]);\
}\
else\
fprintf(fp, "%02x", ptr[i]);\
}\
fprintf(fp, "\n");\
}\
我不应该在宏的参数列表中使用 void、const 或 * 吗?任何帮助将不胜感激。
最佳答案
宏是文本替换,而不是函数调用。应该是
#define hex_display(v_ptr, num)\
{\
uchar const *ptr = v_ptr;\
int i;\
for (i=0; i<num; i++)\
{\
if(i != 0)\
{\
if(((i%4) == 0) && ((i%16) != 0))\
{\
fprintf(fp, "\t");\
}\
if((i%16) == 0)\
fprintf(fp, "\n");\
fprintf(fp, "%02x", ptr[i]);\
}\
else\
fprintf(fp, "%02x", ptr[i]);\
}\
fprintf(fp, "\n");\
}\
无论如何,不推荐使用宏作为函数。您应该期望调试器性能不佳。使用其他方法内联。
为什么不用宏,看下面的例子。
#define text(x) x+x
当你打电话时
text(i++)
i 将递增两次,而不是一次。
关于c - 将宏转换为函数的问题 [C],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21326738/