C 语言拼接宏


It is often useful to merge two tokens into one while expanding macros.

进行宏展开的时候将两个符号合并成为一个符号是很有用的。

 This is called token pasting or token concatenation. 

这就叫做符号拼接。

The ‘##’ preprocessing operator performs token pasting.

##预处理操作符就用来执行符号拼接

 When a macro is expanded, the two tokens on either side of each ‘##’ operator are combined into a single token, 

进行宏展开的时候,在##两端的符号被拼成一个符号

which then replaces the ‘##’ and the two original tokens in the macro expansion.

在展开后的结果中,新拼接的符号就取代了两个旧符号和##

 Usually both will be identifiers, or one will be an identifier and the other a preprocessing number. 

When pasted, they make a longer identifier. 

This isn't the only valid case. 

It is also possible to concatenate two numbers (or a number and a name, such as 1.5 and e3) into a number. 

Also, multi-character operators such as += can be formed by token pasting.


However, two tokens that don't together form a valid token cannot be pasted together. For example, you cannot concatenate x with + in either order. If you try, the preprocessor issues a warning and emits the two tokens. Whether it puts white space between the tokens is undefined. It is common to find unnecessary uses of ‘##’ in complex macros. If you get this warning, it is likely that you can simply remove the ‘##’.

Both the tokens combined by ‘##’ could come from the macro body, but you could just as well write them as one token in the first place. Token pasting is most useful when one or both of the tokens comes from a macro argument. If either of the tokens next to an ‘##’ is a parameter name, it is replaced by its actual argument before ‘##’ executes. As with stringification, the actual argument is not macro-expanded first. If the argument is empty, that ‘##’ has no effect.

Keep in mind that the C preprocessor converts comments to whitespace before macros are even considered. Therefore, you cannot create a comment by concatenating ‘/’ and ‘*’. You can put as much whitespace between ‘##’ and its operands as you like, including comments, and you can put comments in arguments that will be concatenated. However, it is an error if ‘##’ appears at either end of a macro body.

Consider a C program that interprets named commands. There probably needs to be a table of commands, perhaps an array of structures declared as follows:
一个用来解析命名命令的C程序, 可能需要一张由结构体数组构成的命令列表。
struct command
{
char *name;
void (*function) (void);
};

struct command commands[] =
{
{ "quit", quit_command },
{ "help", help_command },
...
};
It would be cleaner not to have to give each command name twice, once in the string constant and once in the function name. 

A macro which takes the name of a command as an argument can make this unnecessary. 

The string constant can be created with stringification, and the function name by concatenating the argument with ‘_command’. Here is how it is done:
字符串常数可以用#来产生,函数名就可以采用##拼接产生。


#define COMMAND(NAME) { #NAME, NAME ## _command }

struct command commands[] =
{
COMMAND (quit),
COMMAND (help),
...
};

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值