9

有没有办法在 c++ 中做这样的事情,似乎 sizeof 由于某种原因不能在那里使用?

#if sizeof(wchar_t) != 2
#error "wchar_t is expected to be a 16 bit type."
#endif
4

7 回答 7

15

不,这不能完成,因为所有宏扩展(#... 事情)都是在预处理器步骤中完成的,它对 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 定义的内容。

于 2009-08-02T15:50:52.663 回答
8

预处理器在不知道任何类型的情况下工作,即使是内置的。

顺便说一句,您仍然可以使用类似 static_assert 的功能进行检查(例如,boost 有一个,C++0X 将有一个)。

编辑:C99 和 C++0X 也有WCHAR_MINWCHAR_MAX<stdint.h>

于 2009-08-02T15:51:32.537 回答
4

我认为像BOOST_STATIC_ASSERT这样的东西会有所帮助。

于 2009-08-02T16:15:45.753 回答
3

sizeof() 是一个运行时编译时函数。您不能在预处理器指令中调用它。我认为您无法在预处理期间检查 wchar_t 的大小。(见编辑2)

编辑:正如评论中指出的, sizeof()主要是在编译时计算的。在 C99 中,它可以在运行时用于数组

编辑 2:您可以使用此线程中描述的技术在构建时进行断言。

于 2009-08-02T15:51:27.823 回答
3

通过使用 C_ASSERT,你不会得到你想要的(编译错误没有花哨的消息)吗?

#define C_ASSERT(e) typedef char __C_ASSERT__[(e)?1:-1]
于 2009-08-02T16:27:18.050 回答
1
char _assert_wchar_t_is_16bit[ sizeof(wchar_t) == 2 ? 1 : -1];
于 2009-08-02T16:18:53.233 回答
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)

于 2017-05-26T22:00:33.067 回答