C++:宏参数中可以包含 space 吗?
C++: Can a macro argument have a space in it?
如果我定义一个带有参数的宏,如下所示。
#define define_int(a) int a;
并提供一个参数 space 如下所示
define_int(* a)
并获得输出?
int * a;
预期用途
#define ASSIGN(A,B) B=A;
我想 return 从一个函数直接使用这个宏作为
ASSIGN(A, return B)
这样它会输出,
return B = A;
space 本身什么都不做,因为 spaces 用于分隔预处理器标记,宏在完成后进行预处理。因此,您可以添加任意数量的 space。
唯一的问题是你不能违反语法,所以这个经典错误不会编译:
#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 中发明自己的秘密宏语言是其中一件非常愚蠢的事情。
关于为带有一些清理代码的函数宏为 return 发明类似 ASSIGN(A, return B)
的编辑,此类宏的不同风格既常用又天真。
当您需要从多个地方 return 时,在函数中集中清理的正确方法是(伪代码):
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;
}
}
当您只需要 return 出错时,这种设计模式减少了实际函数内部的混乱。它还摆脱了 "BASIC style" on error goto,这是编写错误处理程序的另一种相当天真的方式。
如果我定义一个带有参数的宏,如下所示。
#define define_int(a) int a;
并提供一个参数 space 如下所示
define_int(* a)
并获得输出?
int * a;
预期用途
#define ASSIGN(A,B) B=A;
我想 return 从一个函数直接使用这个宏作为
ASSIGN(A, return B)
这样它会输出,
return B = A;
space 本身什么都不做,因为 spaces 用于分隔预处理器标记,宏在完成后进行预处理。因此,您可以添加任意数量的 space。
唯一的问题是你不能违反语法,所以这个经典错误不会编译:
#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 中发明自己的秘密宏语言是其中一件非常愚蠢的事情。
关于为带有一些清理代码的函数宏为 return 发明类似 ASSIGN(A, return B)
的编辑,此类宏的不同风格既常用又天真。
当您需要从多个地方 return 时,在函数中集中清理的正确方法是(伪代码):
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;
}
}
当您只需要 return 出错时,这种设计模式减少了实际函数内部的混乱。它还摆脱了 "BASIC style" on error goto,这是编写错误处理程序的另一种相当天真的方式。