宏定义 ## 连接符多参数问题
代码如下,当首参数不为0时,输入正常,但是首参数为0时,输出的打印就看不懂了
#include "stdio.h"
#define LINK(A,B,C,D) A##B##C##D
void main(void){
printf("\r\n %d, %x", LINK(1,0,2,4), LINK(1,0,2,4));
printf("\r\n %d, %x", LINK(0,0,1,2), LINK(0,0,1,2));
printf("\r\n %d, %x", LINK(10,0,1,2), LINK(10,0,1,2));
}
调试输出结果为:
1024, 400
10, a
10012, 271c
这是为什么呢 还有,LINK是不是不能替换变量,以下代码会报错
#include "stdio.h"
#define LINK(A,B,C,D) A##B##C##D
void main(void){
int a,b,c,d;
scanf("%d %d %d %d", &a,&b,&c,&d);
printf("==== %d %d %d %d =====", a,b,c,d);
printf("\r\n %d, %x", LINK(a,b,c,d), LINK(a,b,c,d));
}
t10.c:12: error: ‘abcd’ undeclared (first use in this function)
t10.c:12: error: (Each undeclared identifier is reported only once
t10.c:12: error: for each function it appears in.)
一楼那个,我没看懂你想问什么
二楼的是因为 宏不是函数,宏只是单纯的替换
printf("\r\n %d, %x", LINK(a,b,c,d), LINK(a,b,c,d));
//这里其实就相当于
printf("\r\n %d, %x", abcd, abcd);
//但是你并没有定义abcd这个变量 yuxijian2020 发表于 2021-4-8 11:11
一楼那个,我没看懂你想问什么
二楼的是因为 宏不是函数,宏只是单纯的替换
一楼上面宏定义
#define LINK(A,B,C,D) A##B##C##D
参数代入后
LINK(1,2,3,4) //输出1234没问题
然后
LINK(0,0,1,2) //理论上应该是输出0012,但是实际输出为10 yuxijian2020 发表于 2021-4-8 11:11
一楼那个,我没看懂你想问什么
二楼的是因为 宏不是函数,宏只是单纯的替换
然后二楼,上面有定义a,b,c,d三个变量哦 你可能都没看懂我在说啥
首先第一个输出没有任何问题
//这里 1 0 2 4 被接在一起然后分别以十进制和十六进制输出到屏幕
//分别为1024 400
printf("\r\n %d, %x", LINK(1,0,2,4), LINK(1,0,2,4));
//这里 0 0 1 2 被连接在一起 (0012) 被计算机识别为8进制数字
//分别以十进制和十六进制输出到屏幕
//输出到屏幕分别为10 a
printf("\r\n %d, %x", LINK(0,0,1,2), LINK(0,0,1,2));
//这里 10 0 1 2 被连接在一起 分别以十进制和十六进制输出到屏幕
//10012 271c
printf("\r\n %d, %x", LINK(10,0,1,2), LINK(10,0,1,2));
第二个,你压根就没明白 ##连接 是直接字面连接而不是对a b c d内部存的值连接
a b c d被连接成了abcd 这个符号不是c关键字也不是任何有意义的符号
你只定义了a变量b变量c变量d变量 并没有定义abcd这个名字的变量
懂了? yuxijian2020 发表于 2021-4-8 14:25
你可能都没看懂我在说啥
首先第一个输出没有任何问题
了然{:10_262:}没考虑到8进制
为了防止你看不懂,我给你贴张图,这里a变量是int类型的 yuxijian2020 发表于 2021-4-8 14:44
为了防止你看不懂,我给你贴张图,这里a变量是int类型的
{:10_323:}
页:
[1]