c – 数据类型大小的编译时间断言

我想对C/C++项目中的数据类型大小执行编译时检查,并且意外不匹配的错误.简单
#if sizeof foo_t != sizeof bar_t

不编译 – 声称sizeof不是一个正确的编译时常数.

所需的平台范围至少在Visual C与Win32 / 64以及GCC x86 / amd64上.

编辑:编译时,不一定是预处理.只是不是运行时错误.

EDIT2:代码假定wchar_t是2个字节.我想要一个编译错误,如果它是意外编译与4字节wchar的.

解决方法

你有两个选择:

a)C11 static_assert

b)BOOST_STATIC_ASSERT升压

我更喜欢第一个.

编辑:

预处理器不是真正的语言的一部分,因为名称说它预处理一个文件,它没有语言的知识,所以它不知道sizeof.

你可以使用一些模板来做一些编译时代码生成,例如:

template <typename T,bool x = sizeof(T) == 4>
class X;

template <typename T>
class X<T,true> {
  T v;
  const char* msg() const {
    return "My size is 4";
  }
}

template <typename T>
class X<T,false> {
  T v;
  const char* msg() const {
    return "My size is NOT 4";
  }
}

X<int> a;
X<short> b;

相关文章

/** C+⬑ * 默认成员函数 原来C++类中,有6个默认成员函数: 构造函数 析构函数 拷贝...
#pragma once // 1. 设计一个不能被拷贝的类/* 解析:拷贝只会放生在两个场景中:拷贝构造函数以及赋值运...
C类型转换 C语言:显式和隐式类型转换 隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译...
//异常的概念/*抛出异常后必须要捕获,否则终止程序(到最外层后会交给main管理,main的行为就是终止) try...
#pragma once /*Smart pointer 智能指针;灵巧指针 智能指针三大件//1.RAII//2.像指针一样使用//3.拷贝问...
目录&lt;future&gt;future模板类成员函数:promise类promise的使用例程:packaged_task模板类例程...