
マンページから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_BIT
8に指定されているので、POSIXを想定している場合sizeof(int) * 8
。
答え2
gcc
組み込みの定義セットがあります。あなたが探しているもの__SIZEOF_INT__
完全な定義のリストはドキュメントにあります。
https://gcc.gnu.org/onlinedocs/cpp/Common-Pre Defined-Macros.html
定義の代わりにそれを使用する利点は、limits.h
定義がコンパイラに組み込まれていることです。これはこの特定のプラットフォームでは絶対に正確ですが、この特定のブランドのコンパイラに関連しています。
しかし、サイズのため、int
使いやすくなりますsizeof(int)
。