鱼C论坛

 找回密码
 立即注册
查看: 29|回复: 8

[已解决]宏定义 ## 连接符多参数问题

[复制链接]
发表于 6 天前 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
代码如下,当首参数不为0时,输入正常,
但是首参数为0时,输出的打印就看不懂了

  1. #include "stdio.h"

  2. #define LINK(A,B,C,D)   A##B##C##D

  3. void main(void){
  4.         printf("\r\n %d, %x", LINK(1,0,2,4), LINK(1,0,2,4));
  5.         printf("\r\n %d, %x", LINK(0,0,1,2), LINK(0,0,1,2));
  6.         printf("\r\n %d, %x", LINK(10,0,1,2), LINK(10,0,1,2));
  7. }
复制代码


调试输出结果为:
1024, 400
10, a
10012, 271c

这是为什么呢
最佳答案
6 天前
你可能都没看懂我在说啥
首先第一个输出没有任何问题

  1. //这里 1 0 2 4 被接在一起然后分别以十进制和十六进制输出到屏幕
  2. //分别为1024      400
  3. printf("\r\n %d, %x", LINK(1,0,2,4), LINK(1,0,2,4));
  4. //这里 0 0 1 2 被连接在一起 (0012) 被计算机识别为8进制数字
  5. //分别以十进制和十六进制输出到屏幕
  6. //输出到屏幕分别为  10     a
  7. printf("\r\n %d, %x", LINK(0,0,1,2), LINK(0,0,1,2));
  8. //这里 10 0 1 2 被连接在一起 分别以十进制和十六进制输出到屏幕
  9. //10012    271c
  10. 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  这个名字的变量
懂了?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 6 天前 | 显示全部楼层
还有,LINK是不是不能替换变量,以下代码会报错

  1. #include "stdio.h"

  2. #define LINK(A,B,C,D)        A##B##C##D

  3. void main(void){

  4.         int a,b,c,d;

  5.         scanf("%d %d %d %d", &a,&b,&c,&d);

  6.         printf("==== %d %d %d %d =====", a,b,c,d);
  7.         printf("\r\n %d, %x", LINK(a,b,c,d), LINK(a,b,c,d));
  8. }
复制代码


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.)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 6 天前 | 显示全部楼层
一楼那个,我没看懂你想问什么
二楼的是因为 宏不是函数,宏只是单纯的替换
  1. printf("\r\n %d, %x", LINK(a,b,c,d), LINK(a,b,c,d));
  2. //这里其实就相当于
  3. printf("\r\n %d, %x", abcd, abcd);
  4. //但是你并没有定义abcd这个变量
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 6 天前 | 显示全部楼层
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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 6 天前 | 显示全部楼层
yuxijian2020 发表于 2021-4-8 11:11
一楼那个,我没看懂你想问什么
二楼的是因为 宏不是函数,宏只是单纯的替换

然后二楼,上面有定义a,b,c,d三个变量哦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 6 天前 | 显示全部楼层    本楼为最佳答案   
你可能都没看懂我在说啥
首先第一个输出没有任何问题

  1. //这里 1 0 2 4 被接在一起然后分别以十进制和十六进制输出到屏幕
  2. //分别为1024      400
  3. printf("\r\n %d, %x", LINK(1,0,2,4), LINK(1,0,2,4));
  4. //这里 0 0 1 2 被连接在一起 (0012) 被计算机识别为8进制数字
  5. //分别以十进制和十六进制输出到屏幕
  6. //输出到屏幕分别为  10     a
  7. printf("\r\n %d, %x", LINK(0,0,1,2), LINK(0,0,1,2));
  8. //这里 10 0 1 2 被连接在一起 分别以十进制和十六进制输出到屏幕
  9. //10012    271c
  10. 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  这个名字的变量
懂了?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 6 天前 | 显示全部楼层
yuxijian2020 发表于 2021-4-8 14:25
你可能都没看懂我在说啥
首先第一个输出没有任何问题

了然没考虑到8进制

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 6 天前 | 显示全部楼层
111.png
为了防止你看不懂,我给你贴张图,这里a变量是int类型的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 6 天前 | 显示全部楼层
yuxijian2020 发表于 2021-4-8 14:44
为了防止你看不懂,我给你贴张图,这里a变量是int类型的

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1

GMT+8, 2021-4-14 09:48

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表