ANSI C 表达式的条件编译和编译时求值

发布于 2024-11-26 05:10:41 字数 240 浏览 2 评论 0原文

我想做以下事情,但编译器不喜欢它:

unsigned short foo = 1;
// do something with foo
#if sizeof(short) * CHAR_BIT > 16
   foo &= 0xffff;
#endif

我知道这个表达式总是可以在编译时完全求值,但也许它只在预处理器之后才求值?这在 ANSI C 中可能吗?还是我只需在运行时进行检查?

I would like to do the following, but the compiler doesn't like it:

unsigned short foo = 1;
// do something with foo
#if sizeof(short) * CHAR_BIT > 16
   foo &= 0xffff;
#endif

I know this expression can always be fully evaluated at compile time, but maybe it's only evaluated after the preprocessor does it's thing? Is this possible in ANSI C or do I just have to do the check at run time?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

游魂 2024-12-03 05:10:41

您不能在预处理器表达式中使用 sizeof。您可能想做这样的事情:

#include <limits.h>

#if SHRT_MAX > 32767
    /* do soemthing */
#endif

You can't use sizeof in a preprocessor expression. You might want to do something like this instead:

#include <limits.h>

#if SHRT_MAX > 32767
    /* do soemthing */
#endif
ゃ人海孤独症 2024-12-03 05:10:41

如果您的目标是在数据类型大小错误时停止编译,则以下技术很有用:

struct _check_type_sizes
{
  int int_is_4_bytes[(sizeof(int) == 4) ? 1 : -1];
  int short_is_2_bytes[(sizeof(short) == 2) ? 1 : -1];
};

(sizeof() 函数在此由编译器而不是预处理器解释。)

此方法的主要缺点是编译器错误不是很明显。确保您写下非常清晰的评论。

If your aim is to stop compilation when a data type is the wrong size, the following technique is useful:

struct _check_type_sizes
{
  int int_is_4_bytes[(sizeof(int) == 4) ? 1 : -1];
  int short_is_2_bytes[(sizeof(short) == 2) ? 1 : -1];
};

(The sizeof() function is interpreted here by the compiler, not the preprocessor.)

The main disadvantage of this method is that the compiler error isn't very obvious. Make sure you write a very clear comment.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文