加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

在编译时提取宏常量中的位数

发布时间:2020-12-16 09:57:45 所属栏目:百科 来源:网络整理
导读:我需要做一些预处理器魔术.假设我有一个全局常量 #define MAX_VALUE 99999 我需要做的是在编译时以十进制表示形式提取此常量的长度.换句话说,我不想要另一个常数 #define MAX_VALUE_STRLEN 5 污染全局命名空间,我不想在修改MAX_VALUE的情况下在代码中添加需
我需要做一些预处理器魔术.假设我有一个全局常量

#define MAX_VALUE 99999

我需要做的是在编译时以十进制表示形式提取此常量的长度.换句话说,我不想要另一个常数

#define MAX_VALUE_STRLEN 5

污染全局命名空间,我不想在修改MAX_VALUE的情况下在代码中添加需要更改的位置.如果我有一个数字文字,那么我可以做类似的事情

#define INTLEN(x) (sizeof(#x)/sizeof((#x)[0]) - 1)

然后INTLEN(99999)将在编译时扩展到5.不幸的是,我做不了类似的事情

INTLEN(MAX_VALUE),

因为预处理器首先扩展INTLEN,所以我得到了

(sizeof("MAX_VALUE")/sizeof(("MAX_VALUE")[0]) - 1)

是否有预处理器技巧可以达到我想要的效果?我应该能够安全地忽略的另一个棘手的问题是,如果有人决定添加一个类型注释,例如,99999L到常量我仍然可以获得正确的值,那么它是否足够通用?

解决方法

使用#和两级宏扩展进行字符串化,然后切断终止NUL:

#define MAX_VALUE 99999

#define STRINGIFY(x) #x

#define LENGTH(x) (sizeof(STRINGIFY(x)) - 1)

#include <stdio.h>    

int main()
{
    size_t n = LENGTH(MAX_VALUE);
    printf("length = %zun",n);
    return 0;
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读