有没有办法在 c++ 中做这样的事情,似乎 sizeof 由于某种原因不能在那里使用?
#if sizeof(wchar_t) != 2
#error "wchar_t is expected to be a 16 bit type."
#endif
不,这不能完成,因为所有宏扩展(#... 事情)都是在预处理器步骤中完成的,它对 C++ 代码的类型一无所知,甚至不需要对语言有任何了解!它只是扩展/检查 #... 的东西,没有别的!
还有一些其他常见错误,例如:
enum XY
{
MY_CONST = 7,
};
#if MY_CONST == 7
// This code will NEVER be compiled because the pre-processor does not know anything about your enum!
#endif //
您只能访问和使用 #if 中通过编译器的命令行选项或通过 #define 定义的内容。
预处理器在不知道任何类型的情况下工作,即使是内置的。
顺便说一句,您仍然可以使用类似 static_assert 的功能进行检查(例如,boost 有一个,C++0X 将有一个)。
编辑:C99 和 C++0X 也有WCHAR_MIN
和WCHAR_MAX
宏<stdint.h>
我认为像BOOST_STATIC_ASSERT这样的东西会有所帮助。
sizeof() 是一个运行时编译时函数。您不能在预处理器指令中调用它。我认为您无法在预处理期间检查 wchar_t 的大小。(见编辑2)
编辑:正如评论中指出的, sizeof()主要是在编译时计算的。在 C99 中,它可以在运行时用于数组。
编辑 2:您可以使用此线程中描述的技术在构建时进行断言。
通过使用 C_ASSERT,你不会得到你想要的(编译错误没有花哨的消息)吗?
#define C_ASSERT(e) typedef char __C_ASSERT__[(e)?1:-1]
char _assert_wchar_t_is_16bit[ sizeof(wchar_t) == 2 ? 1 : -1];
我开发了一些宏,可以有效地让您在宏条件下使用 sizeof。它们位于我在这里上传的头文件中(MIT 许可证)。
它将允许这样的代码:
#include <iostream>
#include "SIZEOF_definitions.h"
//You can also use SIZEOF_UINT in place of SIZEOF(unsigned, int)
// and UINT_BIT in place of SIZEOF_BIT(unsigned, int)
#if SIZEOF(unsigned, int) == 4
int func() { return SIZEOF_BIT(unsigned, int); }
#elif SIZEOF(unsigned, int) == 8
int func() { return 2 * SIZEOF_BIT(unsigned, int); }
#endif
int main(int argc, char** argv) {
std::cout SIZEOF(unsigned, long, int) << " chars, #bits = " << SIZEOF_BIT(unsigned, long, int) << '\n'
<< SIZEOF(unsigned, int) << " chars, #bits = " << SIZEOF_BIT(unsigned, int) << '\n'
<< SIZEOF(int) << " chars, #bits = " << SIZEOF_BIT(int) << '\n';
std::cout << func() << std::endl;
return 0;
}
注意 中的逗号SIZEOF(unsigned, long, int)
。