C/C++中##与#的使用

来源:互联网 发布:福田网络布线 编辑:程序博客网 时间:2024/06/07 01:19

在酷壳上面看到了这么一个程序,很有意思。


引自酷壳:

下面这段程序的输出结果是:

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
#define f(a,b) a##b
#define g(a)   #a
#define h(a) g(a)
 
int main()
{
        printf("%s\n", h(f(1,2)));
        printf("%s\n", g(f(1,2)));
        return 0;
}

当然,你首先要了解##和#的用法,如果不懂的话,本题你可以直接跳过。
解答:
看到这段程序你可能会认为,这两个printf输出的同一个结果,可是答案却非如此,本题的输出是12和f(1,2),为什么会这样呢?因为这是宏,宏的解开不象函数执行,由里带外。


上面是酷壳的内容,有点没说明白,然后自己研究了一下。

首先普及一下##和#的作用

1、## 这个是C语言的预编译符号,表示把前后2个名字连接起来 

2、#是把宏参数变为一个字符串


然后说一下函数执行和宏解开过程的不同,函数执行是由里而外的,参数中如果还是函数,就会先执行作为参数的函数。宏解开却不同,就像是翻译,从头来。

h(f(1,2)解开过程是:先翻译h为g,然后马上把传入的参数,也就是f(1,2)也翻译成了a##b,于是整体变成了g(a##b),然后翻译成了#(12),于是输出了12
g(f(1,2))解开过程是:先翻译g,#(f(1,2)),因为此时f(1,2)已经整体作为参数了,于是直接当字符输出。

以上为个人理解,如有错误,万望指出,感激不尽
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 为什么解压文件老提示失败怎么办 b站sd卡写入失败怎么办 手机检测不到sd卡怎么办 华为sd卡不可用怎么办 u盘延缓写入失败怎么办 手机提示sd卡不可用怎么办 显示sd卡不可用怎么办 小米手机检测不到sd卡怎么办 小米手机sd卡写入失败怎么办 没有检测到sd卡怎么办 e站图片配额用尽怎么办 内存卡密码忘了怎么办 电脑上酷狗音乐播放失败怎么办 播放失败不支持该文件怎么办 手机山寨云资源失效怎么办 支付密码输错了怎么办 微信密码锁定了怎么办 电脑网易云音乐闪退怎么办 逆战耳机电流声怎么办 肠道感染一直吃药治不好怎么办 如果24小时以后还没到账该怎么办 在游戏平台充值没到账该怎么办 充值豪华黄钻没到账该怎么办 起点签到签满了怎么办 ipad锁屏声音小怎么办 扣扣邮箱文件超大了怎么办 网易邮箱图片已过期怎么办 邮箱里面的文件过期了怎么办 邮箱发的文件过期了怎么办 邮箱发送的文件过期怎么办 小米4s开不开机怎么办 小米平板关机后开不开机怎么办 公司老板跑路了社保怎么办 公司老板跑路社保怎么办 公司被公安局查封社保怎么办 小米四开不了机怎么办 小米的手机后壳裂了怎么办 公司没钱拖欠员工社保怎么办 小米note充不进去电怎么办 公司欠社保没交怎么办 公司不给转社保怎么办