gcc编译期打印宏的值

本文介绍了一种利用gcc函数属性扩展在编译期间打印宏值的方法,通过包含show_macro.h头文件并调用SHOW_MACRO宏,可以在编译警告信息中查看到宏的详细运算结果,尤其适用于复杂的宏运算值,如sizeof或位运算。同时,该头文件还提供了一个SHOW_MSG宏,用于根据编译期表达式结果打印不同字符串。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如果我们想知道一个宏的值应该怎么办?

要么在代码里加一句printf

要么在编译的时候gcc -E

第一种方法需要程序运行起来,颇为麻烦

第二种方法无法应付下面这些情况

比如宏的值等于sizeof(struct xxoo)

比如宏本身就是一个复杂的运算(((2U) << (((0+8)+8)+13)) | ((('W')) << (0+8)) | (((7)) << 0) | (((((sizeof(int) == sizeof(int[1]) && sizeof(int) < (1 << 13)) ? sizeof(int) : __invalid_size_argument_for_IOC))) << ((0+8)+8)))


我设计了一个编译期打印宏值的方法,原理是利用gcc函数属性扩展warning和编译期运算

代码show_marco.h

#ifndef _SHOW_MACRO_H_
#define _SHOW_MACRO_H_

/*
SHOW_MSG(expression, true string, false string)
SHOW_MACRO(MACRO_NAME)
SHOW_MACRO(ENUM_NAME)
MACRO2STRING(MACRO_NAME)

zhaoxiaogang 2014-11-18
*/

#define MACRO2STRING_(M) #M
#define MACRO2STRING(M) MACRO2STRING_(M)

#define a_t_t_r(S) __attribute__((warning(S)))

#define SHOW_MSG__(E, S1, S2, N) \
    int str1__##N(void) a_t_t_r(S1); \
    int str2__##N(void) a_t_t_r(S2); \
    int str0__##N(void) { return (E) ? str1__##N() : str2__##N(); } \
    struct stru__##N { unsigned int check_expression : 1 + !(E); };

#define SHOW_MSG_(E, S1, S2, N) SHOW_MSG__(E, S1, S2, N)

#ifdef __COUNTER__
#  define SHOW_MSG(E, S1, S2) SHOW_MSG_(E, S1, S2, __COUNTER__)
#else
#  define SHOW_MSG(E, S1, S2) SHOW_MSG_(E, S1, S2, __LINE__)
#endif

#define j_(v) int show__0x##v(void) a_t_t_r(#v);
j_(0) j_(1) j_(2) j_(3) j_(4) j_(5) j_(6) j_(7) j_(8) j_(9) j_(a) j_(b) j_(c) j_(d) j_(e) j_(f)

#define k_(M,i,j) (((((M)+0ULL)>>((15-0x##i)*4))&0xF)==0x##j ? show__0x##j() : 0) +

#define SHOW_MACRO(M) \
    int M##__eq(void) a_t_t_r(#M"&n
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值