我尝试使用串联预处理器操作符##来理解c中的宏,但我意识到我的令牌有问题.我认为这很容易,但实际上并非如此.
因此,串联用于连接两个令牌以创建新令牌.例如:连接(
和)
或int
和*
我试过了
#define foo(x,y) x ## y foo(x,y)
每当我给它一些论据时,我总是会错误地说出来 pasting both argument does not give a valid preprocessor token.
例如,为什么连接foo(1,aa)
结果1aa
(哪种类型的令牌是它?以及它为什么有效)但foo(int,*)
我得到了一个错误.
有没有办法知道哪些令牌是有效的,或者是否有可能有一些良好的联系,以了解如何在我的脑海中澄清它.(我已经谷歌搜索谷歌和SO)
我错过了什么?
我会很感激.
预处理程序标记连接用于生成新标记,但它不能将任意语言结构粘贴在一起(例如,gcc文档):
但是,不能一起形成有效令牌的两个令牌不能粘贴在一起.例如,您无法以任何顺序将x与+连接.
所以尝试一个宏,使指针出类型的指针
#define MAKEPTR(NAME) NAME ## * MAKEPTR(int) myIntPtr;
是无效的,因为int*
是两个令牌,而不是一个.
但是,上述链接的示例显示了新令牌的生成:
#define COMMAND(NAME) { #NAME, NAME ## _command } struct command commands[] = { COMMAND (quit), COMMAND (help), ... };
收益率:
struct command commands[] = { { "quit", quit_command }, { "help", help_command }, ... };
令牌quit_command
之前不存在但通过令牌连接生成.
请注意表单的宏
#define MAKEPTR(TYPE) TYPE* MAKEPTR(int) myIntPtr;
是有效的,实际上生成一个指针类型TYPE
,例如int*
out int
.