当前位置:  开发笔记 > 编程语言 > 正文

宏连接中的有效预处理程序标记

如何解决《宏连接中的有效预处理程序标记》经验,为你挑选了1个好方法。

我尝试使用串联预处理器操作符##来理解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)

我错过了什么?

我会很感激.



1> Stephan Lech..:

预处理程序标记连接用于生成新标记,但它不能将任意语言结构粘贴在一起(例如,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.

推荐阅读
女女的家_747
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有