C :宏参数可以在其中有空间吗?

C++: Can a macro argument have a space in it?

本文关键字:空间 在其中 参数      更新时间:2023-10-16

如果我定义了一个宏的参数如下。

#define define_int(a) int a;

,并提供一个与以下相似的空间的参数

define_int(* a)

并获取输出?

int * a;

预期用途

#define ASSIGN(A,B) B=A;

我想使用此宏直接从函数返回

ASSIGN(A, return B)

以便输出,

return B = A;

空间本身无济于事,因为空格用于分离处理前令牌,并且宏已完成后进行了预处理。因此,您可以添加尽可能多的空间。

唯一的问题是您不能违反语法,因此这个经典错误不会汇编:

#define A (B, C) ...  // bad syntax, space between macro name and parameter list
#define A(B, C) ... // ok

是的,您可以写一些晦涩的东西,例如

#define define_int(a) int a;
...
define_int(*const a);

define_int(*        const     a     );

并获取类型int*const a;

为什么您想编写如此可怕的代码,我不知道。在C中发明自己的秘密宏观语言是其中之一。


关于用一些清理代码从功能宏返回的ASSIGN(A, return B)之类的编辑,此类宏的不同风味通常是使用的和天真的。

当您需要从多个位置返回时,将清理集中在功能中的正确方法是(伪代码(:

void wrapper (void)
{
  something a = allocate_stuff();
  error result = the_actual_function(a);
  if(result == whatever)
    do_that();
  cleanup(a);
}
inline error the_actual_function (something a)
{
  ...
  if(bad)
  {
    return error_42;
  }
}

当您只需要在错误时返回时,此设计模式就会减少实际功能内部的混乱。它也摆脱了错误Goto的"基本样式",这是另一种幼稚的写入错误处理程序的方式。

相关文章: