![为什么Linux上的limits.h中没有WORD_BIT?](https://linux22.com/image/210199/%E4%B8%BA%E4%BB%80%E4%B9%88Linux%E4%B8%8A%E7%9A%84limits.h%E4%B8%AD%E6%B2%A1%E6%9C%89WORD_BIT%EF%BC%9F.png)
从联机帮助页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_BIT
;CHAR_BIT
总是被定义的。此外,POSIX 扩展了 C 标准并指定为CHAR_BIT
8,因此如果您假设 POSIX,则可以使用sizeof(int) * 8
.
答案2
有gcc
一组内置定义。您正在寻找的是__SIZEOF_INT__
完整的定义列表位于文档中:
https://gcc.gnu.org/onlinedocs/cpp/Common-Predefined-Macros.html
使用这些而不是定义的优点limits.h
是编译器中内置的定义是内置于编译器中的 - 它们对于这个特定平台来说绝对正确,但与这个特定品牌的编译器相关。
但对于尺寸而言,int
使用起来要容易得多sizeof(int)
。