You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 15:07:44