Sev*_*yev 12 c c++ c-preprocessor
我想对C/C++项目中的数据类型大小执行编译时检查,并在意外不匹配时执行错误.简单
#if sizeof foo_t != sizeof bar_t
Run Code Online (Sandbox Code Playgroud)
不编译 - 声称sizeof不是一个正确的编译时常量.
所需的平台范围 - 至少是使用Win32/64的Visual C++,以及x86/amd64上的GCC.
编辑:编译时,不一定是预处理器.只是不是运行时错误.
EDIT2:代码假定wchar_t
是2个字节.如果用4字节的wchar意外编译,我想要编译错误.
111*_*111 10
在C++ 11中,您可以使用静态断言
static_assert(sizeof(foo_t) == sizeof(bar_t), "sizes do not match");
Run Code Online (Sandbox Code Playgroud)
如果它是预先C++ 11,那么你可以使用boost static assert宏
http://www.boost.org/doc/libs/1_48_0/doc/html/boost_staticassert.html
BOOST_STATIC_ASSERT(sizeof(int)==sizeof(unsigned));
BOOST_STATIC_ASSERT_MSG(sizeof(int)==sizeof(unsigned), "sizes do not match");
Run Code Online (Sandbox Code Playgroud)
您有两种选择:
a)C++ 11的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;
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
7733 次 |
最近记录: |