木子李工 发表于 2021-4-8 10:42:16

宏定义 ## 连接符多参数问题

代码如下,当首参数不为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

这是为什么呢

木子李工 发表于 2021-4-8 10:50:48

还有,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.)

yuxijian2020 发表于 2021-4-8 11:11:31

一楼那个,我没看懂你想问什么
二楼的是因为 宏不是函数,宏只是单纯的替换
printf("\r\n %d, %x", LINK(a,b,c,d), LINK(a,b,c,d));
//这里其实就相当于
printf("\r\n %d, %x", abcd, abcd);
//但是你并没有定义abcd这个变量

木子李工 发表于 2021-4-8 11:50:38

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

木子李工 发表于 2021-4-8 11:51:10

yuxijian2020 发表于 2021-4-8 11:11
一楼那个,我没看懂你想问什么
二楼的是因为 宏不是函数,宏只是单纯的替换

然后二楼,上面有定义a,b,c,d三个变量哦

yuxijian2020 发表于 2021-4-8 14:25:42

你可能都没看懂我在说啥
首先第一个输出没有任何问题

//这里 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这个名字的变量
懂了?

木子李工 发表于 2021-4-8 14:42:15

yuxijian2020 发表于 2021-4-8 14:25
你可能都没看懂我在说啥
首先第一个输出没有任何问题



了然{:10_262:}没考虑到8进制

yuxijian2020 发表于 2021-4-8 14:44:47


为了防止你看不懂,我给你贴张图,这里a变量是int类型的

木子李工 发表于 2021-4-8 14:55:38

yuxijian2020 发表于 2021-4-8 14:44
为了防止你看不懂,我给你贴张图,这里a变量是int类型的

{:10_323:}
页: [1]
查看完整版本: 宏定义 ## 连接符多参数问题