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

时间:2015-04-29 19:00:52

标签: c c-preprocessor

我需要做一些预处理器魔术。假设我有一个全局常量

#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,我仍然可以得到正确的值吗?

0 个答案:

没有答案