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

rah*_*hmu 9 linux c header-file

从联机帮助页man limits.h

\n
       {WORD_BIT}\n             Number of bits in an object of type int.\n             Minimum Acceptable Value: 32\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
#include <limits.h>\n#include <stdio.h>\n\nint main() {\n  printf("%d\\n", WORD_BIT);\n  return 0;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
error: \xe2\x80\x98WORD_BIT\xe2\x80\x99 undeclared (first use in this function)\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

我的系统:

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

Ste*_*itt 16

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

\n
$ gcc -include limits.h -E - <<<"WORD_BIT" | tail -n1\nWORD_BIT\n\n$ gcc -D_GNU_SOURCE -include limits.h -E - <<<"WORD_BIT" | tail -n1\n32\n
Run Code Online (Sandbox Code Playgroud)\n

你真的应该使用sysconf

\n
$ gcc -include limits.h -E - <<<"WORD_BIT" | tail -n1\nWORD_BIT\n\n$ gcc -D_GNU_SOURCE -include limits.h -E - <<<"WORD_BIT" | tail -n1\n32\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
#include <unistd.h>\n#include <stdio.h>\n\nint main(int argc, char **argv) {\n  printf("%ld\\n", sysconf(_SC_WORD_BIT));\n}\n
Run Code Online (Sandbox Code Playgroud)\n

(至于为什么它出现在 中man limits.h,这个手册页是的 POSIX 参考limits.h,\xe2\x80\x99 不一定准确地记录您系统上的 C 库。您可以通过查看手册页 \xe2 的部分来了解这一点\x80\x94 \xe2\x80\x9cP\xe2\x80\x9d 后缀表示它\xe2\x80\x99s POSIX 文档。)

\n

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

\n