【问题标题】:Pointer in macro parameter list宏参数列表中的指针
【发布时间】:2011-06-20 19:21:40
【问题描述】:

我目前正在尝试基于编译器标志定义一个函数。如果设置了 TRACE 标志,那么我想定义一个宏来将信息传递给跟踪组件。

#define TRACERPTR(Reporter * pReporter, traceComponent eComponent, traceLevel eLevel, string sFormat, formatArgs...) \
if (pReporter != NULL) { pReporter->trace(eComponent, eLevel, sFormat, ##formatArgs); }

Reporter 是一个类,定义在同一个 .h 文件中,位于此宏上方。我需要传递一个reporter对象的指针,然后用它来调用trace函数。

但是,我得到一个编译器错误:

错误:“*”可能不会出现在宏中 参数列表

我很好奇如果我只是删除“*”会发生什么——这会导致错误“宏参数必须以逗号分隔”。

知道我在这里做错了什么吗?

【问题讨论】:

    标签: c++ c macros


    【解决方案1】:

    据我所知,至少在 C 语言中,宏参数是没有类型的。这都是符号替换。只需使用pReporter 而不是Reporter * pReporterReporter pReporter

    (我想这同样适用于您的宏的其他参数。)

    【讨论】:

      【解决方案2】:

      正如 JAB 所指出的,宏不同于函数,它们不需要参数的类型

      #define TRACERPTR(pReporter, eComponent, eLevel, sFormat, formatArgs...) \
      if (pReporter != NULL) { pReporter->trace(eComponent, eLevel, sFormat, ##formatArgs); }
      

      【讨论】:

        【解决方案3】:

        只需在您的通话中添加& 标记:

        #define SCAN_INT(str, myInt) (sscanf(str, "%d", myInt))
        
        const char *myString = "23";
        int myInteger;
        SCAN_INT(myString, &myInteger);
        

        或者你可以自动化它,就像 ncurses' getyx() 做的那样:

        #define SCAN_INT(str, myInt) (sscanf(str, "%d", &myInt))
        
        const char *myString = "23";
        int myInteger;
        SCAN_INT(myString, myInteger);
        

        希望对你有帮助, ief2

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-10-15
          • 1970-01-01
          • 2022-01-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多