为什么Linux上的limits.h中没有WORD_BIT?

为什么Linux上的limits.h中没有WORD_BIT?

从联机帮助页man limits.h

       {WORD_BIT}
             Number of bits in an object of type int.
             Minimum Acceptable Value: 32

但是,如果我运行一个简单的程序:

#include <limits.h>
#include <stdio.h>

int main() {
  printf("%d\n", WORD_BIT);
  return 0;
}

然而,当尝试使用 gcc ( gcc file.c -o file) 进行编译时,我得到以下信息:

error: ‘WORD_BIT’ undeclared (first use in this function)

为什么我的系统上没有定义这个信息,我还能在哪里找到这个信息(在 C 程序中)?

我的系统:

  • Fedora 36(银蓝色)
  • gcc 版本 12.2.1 20220819(红帽 12.2.1-1)(GCC)
  • ldd(GNU libc)2.35

答案1

我不确定这是否已记录,但使用 GNU C 库,您需要设置_GNU_SOURCE以获得WORD_BIT

$ gcc -include limits.h -E - <<<"WORD_BIT" | tail -n1
WORD_BIT

$ gcc -D_GNU_SOURCE -include limits.h -E - <<<"WORD_BIT" | tail -n1
32

你真的应该使用sysconf

#include <unistd.h>
#include <stdio.h>

int main(int argc, char **argv) {
  printf("%ld\n", sysconf(_SC_WORD_BIT));
}

或者,按照 GNU C 库文档中的建议

#include <limits.h>
#include <unistd.h>
#include <stdio.h>

int main(int argc, char **argv) {
#ifdef WORD_BIT
  printf("%d\n", WORD_BIT);
#else
  printf("%ld\n", sysconf(_SC_WORD_BIT));
#endif
}

(至于为什么会出现在man limits.h,这个手册页是POSIX 参考limits.h,并且不一定准确记录您系统上的 C 库。您可以通过查看手册页的部分来看到这一点 - “P”后缀表示它是 POSIX 文档。)

你可以改用sizeof(int) * CHAR_BITCHAR_BIT总是被定义的。此外,POSIX 扩展了 C 标准并指定为CHAR_BIT8,因此如果您假设 POSIX,则可以使用sizeof(int) * 8.

答案2

gcc一组内置定义。您正在寻找的是__SIZEOF_INT__

完整的定义列表位于文档中:
https://gcc.gnu.org/onlinedocs/cpp/Common-Predefined-Macros.html

使用这些而不是定义的优点limits.h是编译器中内置的定义是内置于编译器中的 - 它们对于这个特定平台来说绝对正确,但与这个特定品牌的编译器相关。

但对于尺寸而言,int使用起来要容易得多sizeof(int)

相关内容