c++ - 在编译时检查字符串文字的长度

标签 c++

我想在编译时检查我的字符串文字的长度。目前我正在考虑以下构造,但无法完成:

#define STR(s) (sizeof(s) < 10 ? s : /* somehow perform static_assert */)

void foo(const char* s) {}
int main() { 
    foo(STR("abc")); // foo("abc")
    foo(STR("abcabcabcabc")); // compile time error: "String exceeds 10 bytes!"
}

最佳答案

这是 C++,其中有比宏更高级的选项。模板可以为您提供您想要的确切语义。

template<std::size_t N>
constexpr auto& STR(char const (&s)[N]) {
    static_assert(N < 10, "String exceeds 10 bytes!");
    // < 11 if you meant 10 characters. There is a trailing `\0`
    // in every literal, even if we don't explicitly specify it
    return s;
}

数组引用参数将绑定(bind)到字符串字面值,而不是指针(指针可能会触发您的宏),推断出它们的大小,并在函数体中执行检查。然后,如果一切都检查完毕,它将返回未更改的引用,甚至允许继续进行重载解析。

关于c++ - 在编译时检查字符串文字的长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52852503/

相关文章:

c++ - 试图在类中定义静态常量变量

c++ - 定义的随机问题

c++ - 为什么 C++ 在 C 中已经存在的 IO 中引入了新函数?

c++ - 在程序中导致段错误不会被信号处理程序捕获

c++ - ofstream "<<"和 Write 有什么区别

c++ - 根据值的概率从 Map 中获取随机键

C++ 正则表达式在第一个空格后拆分

c++ - 通过观察者将信号映射到插槽以获得可变数量的参数

c++ - 从函数返回进入无限循环Visual Studio 2012

C++使用模板为结构定义别名