我试着做一个像这样的宏:
#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]; \
}
这确保了不接受八进制和十六进制,只接受十进制文字.