【问题标题】:Meaning of macro foo(a,b, ;)宏 foo(a,b, ;) 的含义
【发布时间】:2012-09-08 16:34:32
【问题描述】:

我在公司里浏览了一些旧的 C 代码,这些代码是在没有 gcc -flags 选项的情况下编译的,我遇到了一行奇怪的代码。

#define foo(a,b) foonew(a,b, ;)

谁能给我解释一下这是做什么的?

编辑: 因为它是未使用gcc -flags 编译的大型代码库的一部分,所以我看不到预处理的form.Compilation 是否成功完成而没有错误或警告。

【问题讨论】:

  • 什么是foonew?是另一个宏吗? (无论如何,这很奇怪)
  • 你能展示一个用例吗?
  • 为什么不能编译?错误信息是什么?你怎么不能访问foonew?它必须出现在代码中的某个地方,所以你是说你没有这个代码了?
  • 再一次,知道你不能编译它也无济于事。如果没有其他信息,我们根本无法为您提供帮助。逐步查看错误消息或编译器。如果您发现与上述宏相关的错误,请将其粘贴到此处。即使是“公司代码”,你也应该能找到foonew。
  • 如果您无法访问foonew,则不得在代码库中的任何位置调用foo。如果foo 在某处被调用,那么你就错了,你确实可以访问foonew。

标签: c macros


【解决方案1】:

分号用作预处理标记,就像a 和b。它可以用作另一个宏的参数。

例如

#define foonew(x,y,z)   (x + y) z

#define foo(a,b)    foonew(a,b, ;)

int main()
{
   int one = 1;
   int two = 2;

   int three = foo(one, two)   // no semicolon here!

    return three;

}

【讨论】:

  • 这有什么好处?
  • 真的没有什么优势,只是你可以用宏做的疯狂事情的​​一个例子。
【解决方案2】:

这会起作用

 #define foo(a,b) foonew(a,b)

试试这个。

宏参数可以为空(由零个预处理标记组成)。例如,

 #define SUM(a,b,c) a + b + c
  SUM(1,,3)  /* No error message.

1 代替 a, 3 代替 c。 */ 如果标识符列表不以省略号结尾,则宏调用中的参数数量必须与相应宏定义中的参数数量相同。在参数替换期间,所有指定参数被替换后剩余的任何参数(包括任何分隔逗号)都被组合成一个参数,称为变量参数

【讨论】:

    猜你喜欢
    • 2011-03-26
    • 2017-01-21
    • 2012-08-27
    • 1970-01-01
    • 2018-12-10
    • 1970-01-01
    • 2012-07-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多