如何在C语言中检查宏参数是否为整数字面量
确保宏仅接受整数字面量的实现方案
我想要实现如下宏:
#define STRING(i) \ struct STRING##i \ { \ size_t len; \ char chars[i]; \ }
但该宏存在问题:它会接受constexpr参数,例如:
constexpr int ten = 10; STRING(ten) mystr;
这会导致STRING(ten)与STRING(10)成为不兼容的类型,容易造成使用者混淆。
我曾尝试以下实现:
#define STRING(i) \ struct STRING##i \ { \ _Static_assert( CAT(i, ul) , "must be nonzero literal"); \ size_t len; \ char chars[i]; \ }
该实现通过给字面量追加ul使其成为无符号长整型字面量,非字面量会因标识符不匹配而报错,但存在缺陷:若用户定义了如tenul的constexpr变量,仍会误判。
我想寻求更优方案,确保宏仅在传入整数字面量时生效。
补充说明:最终实现
基于已采纳的方案,我最终实现如下:
#define STRING(i) \ struct STRING##i \ { \ _Static_assert((1##i##1ul || i##8ul || 1), "argument must be positive decimal integer literal"); \ size_t len; \ char chars[i]; \ }
该实现可确保仅接受十进制整数字面量,拒绝八进制和十六进制字面量。
内容的提问来源于stack exchange,提问作者Abdulmalek Almkainzi
相关产品推荐
相关产品推荐

