c - 将宏转换为函数的问题 [C]

标签 c macros

我有以下函数,我正在尝试将其转换为宏。

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/

相关文章:

c - “C”编程 - 神秘的结构语法 - 几乎看起来像 Python 字典 - 这是什么?

c - 当我遇到1时使用递归进行分段

c - 类函数宏的错误扩展

c++ - 嵌套 i, j 循环的宏

c - 如果return 1之前有exit(0),return1会执行吗?

c - 插入排序函数不会列出排序后的所有元素

c - 如何修复段错误(核心转储)错误

macros - 编写宏时获取原始符号名称

c - c中的typedef和#define是一样的吗?

c++ - C++ 中方法和对象选择的静态多态性