硬汉嵌入式论坛

 找回密码
 立即注册
查看: 954|回复: 5
收起左侧

[MDK] 空宏定义的问题

[复制链接]

6

主题

45

回帖

63

积分

初级会员

积分
63
发表于 2022-3-22 19:12:12 | 显示全部楼层 |阅读模式
image.png

如上图,我想定义这个宏为空

#define ATTR_PRINTF((one_based_format_index), (first_arg))
int my_printf(const char* format, ...) ATTR_PRINTF(1, 2);


为什么这样不行呢,提示的错误类型也挺奇怪。
回复

使用道具 举报

6

主题

45

回帖

63

积分

初级会员

积分
63
 楼主| 发表于 2022-3-22 19:13:12 | 显示全部楼层
#define ATTR_PRINTF(one_based_format_index, first_arg) 去掉宏参数的括号就可以。。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106978
QQ
发表于 2022-3-23 10:38:29 | 显示全部楼层
楼主这个本意是要实现什么功能,my_printf重定向printf?
回复

使用道具 举报

6

主题

45

回帖

63

积分

初级会员

积分
63
 楼主| 发表于 2022-3-23 14:16:42 | 显示全部楼层
eric2013 发表于 2022-3-23 10:38
楼主这个本意是要实现什么功能,my_printf重定向printf?

[C] 纯文本查看 复制代码
#ifdef __GNUC__
# define ATTR_PRINTF(one_based_format_index, first_arg) \
__attribute__((format(__printf__, (one_based_format_index), (first_arg))))
# define ATTR_VPRINTF(one_based_format_index) ATTR_PRINTF((one_based_format_index), 0)
#else
# define ATTR_PRINTF((one_based_format_index), (first_arg))
# define ATTR_VPRINTF(one_based_format_index)
#endif


如上代码,这个实际上是实现编译检查自定义printf的格式。在MDK上AC5 因为不满足条件,所以应该定义为空的宏,实际测试上述代码编译有问题,参数空宏定义的话不能嵌套括号。
[C] 纯文本查看 复制代码
ATTR_PRINTF(one_based_format_index, first_arg)

改成上面这样就可以。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106978
QQ
发表于 2022-3-24 00:37:38 | 显示全部楼层
A.orz 发表于 2022-3-23 14:16
[mw_shl_code=c,true]#ifdef __GNUC__
# define ATTR_PRINTF(one_based_format_index, first_arg) \
__ ...

好的,楼主的意思是问题已经解决了?
回复

使用道具 举报

6

主题

45

回帖

63

积分

初级会员

积分
63
 楼主| 发表于 2022-3-24 09:24:43 | 显示全部楼层
eric2013 发表于 2022-3-24 00:37
好的,楼主的意思是问题已经解决了?

是的,就是去掉空宏中嵌套的括号就可以了,我不知道是语法规定还是怎么着,带参空宏定义就不能用括号嵌套嘛?我也没有查到相关的资料,上面只是我实验出来的结果。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-12 22:04 , Processed in 0.170958 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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