C/C++长度为0的数组

目录

  • 编译时静态检测
  • 奇怪的问题
  • 其他用法

编译时静态检测

利用长度为0的数组可以实现编译时静态检测, 例如

#define STATIC_CHECK(expr) { char unnamed[(expr) ? 1 : 0]; }

template <class To, class From>
To safe_reinterpret_cast(From from)
{
    STATIC_CHECK(sizeof(From) <= sizeof(To));
    return reinterpret_cast<To>(from);
}

当然这种用法有个不好之处, 编译时的报错信息可能会让你摸不着头脑

奇怪的问题

c/c++标准中规定, 数据长度不能为0, 因此上述方法才能成立. 但是用gcc/g++编译时, 这种写法编译通过, 翻阅资料后, gnu的c工具链并不遵守c/c++标准. 因为长度为0的数据另有用途, 例如

struct var_char
{
    int length;
    char contents[0]
};

因此这样的用法从linux移到windows下, 用vc编译, 是不能通过的(已在visual studio 2017测试, 如果有出入, 请留言反馈)

其他用法

相信长度为0的数组还有其他用法, 后续在补充编辑

你可能感兴趣的:(c/c++)