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

pas*_*sha 3 c++ macros preprocessor

如果我定义一个带有参数的宏,如下所示。

#define define_int(a) int a;
Run Code Online (Sandbox Code Playgroud)

并提供一个参数,中间有空格,如下所示

define_int(* a)
Run Code Online (Sandbox Code Playgroud)

并得到输出?

int * a;
Run Code Online (Sandbox Code Playgroud)

有可能的使用

#define ASSIGN(A,B) B=A;
Run Code Online (Sandbox Code Playgroud)

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

ASSIGN(A, return B)
Run Code Online (Sandbox Code Playgroud)

这样它就会输出,

return B = A;
Run Code Online (Sandbox Code Playgroud)

Lun*_*din 6

空格本身不执行任何操作,因为空格用于分隔预处理器标记,并且在完成后对宏进行预处理。因此,您可以根据需要添加任意多个空格。

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

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

#define A(B, C) ... // ok
Run Code Online (Sandbox Code Playgroud)

所以是的,你可以写一些晦涩的东西,比如

#define define_int(a) int a;
...
define_int(*const a);
Run Code Online (Sandbox Code Playgroud)

或者

define_int(*        const     a     );
Run Code Online (Sandbox Code Playgroud)

并获取类型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;
  }
}
Run Code Online (Sandbox Code Playgroud)

当您只需要在出错时返回时,这种设计模式可以减少实际函数内部的混乱。它还摆脱了错误 goto 上的“BASIC 风格”,这是编写错误处理程序的另一种相当幼稚的方式。