C ++:宏参数可以有空格吗?

时间:2018-04-24 08:22:30

标签: c++ macros preprocessor

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

#define define_int(a) int a;

并提供一个空格的论证,如下所示

define_int(* a)

获得输出?

int * a;

预期用途

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

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

ASSIGN(A, return B)

以便输出,

return B = A;

1 个答案:

答案 0 :(得分:3)

空间本身什么都不做,因为空格用于分隔预处理器令牌,宏在完成后进行预处理。所以你可以添加任意数量的空格。

唯一的问题是你不能违反语法,所以这个经典错误不会编译:

#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上摆脱了“BASIC样式”,这是编写错误处理程序的另一种相当天真的方式。