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

ベストアンサー1

_GNU_SOURCEこれが文書化されているかどうかはわかりませんが、GNU Cライブラリを使用して以下を取得するには設定する必要があります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_BIT8に指定されているので、POSIXを想定している場合sizeof(int) * 8

おすすめ記事