Linux

為什麼 Linux 上的 limits.h 中沒有 WORD_BIT?

  • September 1, 2022

從手冊頁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 (Red Hat 12.2.1-1) (GCC)
  • ldd (GNU libc) 2.35

我不確定這是否記錄在案,但是使用 GNU C 庫,您需要設置_GNU_SOURCEWORD_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_BITS改用;CHAR_BITS總是被定義的。更重要的是,POSIX 擴展了 C 標準並指定CHAR_BITS為 8,因此如果您假設 POSIX,您可以使用sizeof(int) * 8.

引用自:https://unix.stackexchange.com/questions/715751