【问题标题】:C++: Can a macro argument have a space in it?C++:宏参数中可以有空格吗?
【发布时间】:2018-04-24 08:22:29
【问题描述】:

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

#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_int(sd, df)两个 参数传递给 define_int。它需要一个。
  • 问题不在于空格,而在于分隔宏参数的逗号
  • 该宏是一个示例,还是您打算使用的东西?因为在定义变量的语言中发明你自己的迷你语言,不会产生更好的代码。
  • 你为什么喜欢做这样的事情?阅读 define_int(sd, df) 而不是 int sd, df; 会让我感到困惑。
  • 我在提供示例时没有意识到我使用的是逗号运算符,抱歉,更改示例请再看一下。 (我不打算按原样使用)

标签: c++ macros preprocessor


【解决方案1】:

空格本身什么也不做,因为空格用于分隔预处理器标记,并且在完成后对宏进行预处理。因此,您可以添加任意数量的空格。

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

#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 风格”,这是另一种编写错误处理程序的相当幼稚的方式。

【讨论】:

  • 也许粘贴 C 标准以防问题再次发生?投赞成票。
  • @Bathsheba 好吧,希望 OP 现在明白为什么在这里彻底改变问题是一个坏主意:)
  • 我从没想过逗号运算符会是我的 SO 代表的死亡
  • @Lundnin,thnx 4 答案(空格和宏)。现在,我想知道这是否真的是可怕的代码和愚蠢的事情。例如:{#define OUTPUT(x) out x ; out.flush();} 和参数 x 对应一个长序列 var
猜你喜欢
  • 2021-06-12
  • 2015-01-18
  • 1970-01-01
  • 1970-01-01
  • 2021-12-20
  • 1970-01-01
  • 2013-06-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多