相关疑难解决方法(0)

##预处理器运算符和陷阱的应用有哪些应用?

正如我之前的许多问题所述,我正在通过K&R工作,目前正在进入预处理器.其中一个更有意思的事情 - 我之前从未尝试过的任何学习C的尝试 - 是##预处理器操作员.根据K&R的说法:

预处理器运算符## 提供了一种在宏扩展期间连接实际参数的方法.如果替换文本中##的参数与a相邻,则参数将替换为实际参数, ##并删除周围的空白区域,并重新扫描结果.例如,宏paste 连接其两个参数:

#define paste(front, back) front ## back

所以paste(name, 1)创建令牌 name1.

如何以及为什么有人会在现实世界中使用它?它的使用的实际例子是什么,有什么需要考虑的?

c kernighan-and-ritchie stringification c-preprocessor

86
推荐指数
4
解决办法
7万
查看次数

为什么我需要双层间接宏?

在:C++ FAQ - 其他技术问题 - [39.6]对于需要将两个令牌粘贴在一起的宏应该怎么做?

有人可以向我解释原因吗?我所读到的只是相信我,但我不能仅仅相信某事,因为有人这么说.

我尝试了这种方法,但我找不到任何错误:

#define mymacro(a) int a ## __LINE__
mymacro(prefix) = 5;
mymacro(__LINE__) = 5;
int test = prefix__LINE__*__LINE____LINE__; // fine
Run Code Online (Sandbox Code Playgroud)

那么为什么我需要这样做呢(引自网页):

但是,当您使用##时,需要双层间接.基本上你需要为"令牌粘贴"创建一个特殊的宏,例如:

 #define NAME2(a,b)         NAME2_HIDDEN(a,b)
 #define NAME2_HIDDEN(a,b)  a ## b 
Run Code Online (Sandbox Code Playgroud)

相信我 - 你真的需要这样做!(并且请没有人写信给我说它有时可以在没有第二层间接的情况下工作.尝试用__ LINE__连接一个符号然后看看会发生什么.)

编辑:有人也可以NAME2_HIDDEN在下面宣布之前解释他为什么使用?NAME2_HIDDEN在使用宏之前定义宏似乎更合乎逻辑.这是某种伎俩吗?

c++ macros visual-c++

24
推荐指数
1
解决办法
4575
查看次数