私のシステムで_Bool
定義を見つけたいので、それが欠落しているシステムでは、それを実装できます。ここや他のサイトでさまざまな定義を見てきましたが、システムで最終的な定義を確認したいと考えていました。
わずかな問題、_Boolが定義されている場所、またはstdbool.hが見つからない
mussys@debmus:~$ find /usr/include/* -name stdbool.h
/usr/include/c++/4.3/tr1/stdbool.h
また、_Bool
および/usr/include/*
の/usr/include/*/*
のgrep
も検出しません。
それはどこにあるのでしょうか?
_Bool
は組み込み型なので、システムヘッダーファイルであっても、その定義がヘッダーファイルにあるとは思わないでください。
そうは言っても、検索しているパスからシステムを推測すると、/usr/lib/gcc/*/*/include
?
私の「本当の」stdbool.h
そこに住んでいます。さすが#define
s bool
は_Bool
。なので _Bool
はコンパイラーにネイティブなタイプであり、ヘッダーファイルには定義されていません。
注として:
_BoolはC99で定義されています。プログラムを次のように作成した場合:
gcc -std=c99
あなたはそれがそこにあると期待することができます。
他の人々は_Bool
の場所に関する質問に回答し、C99が宣言されているかどうかを見つけました...しかし、私は誰もが行った自作の宣言に満足していません。
タイプを完全に定義しないのはなぜですか?
typedef enum { false, true } bool;
一部のコンパイラーは_Boolキーワードを提供しないため、独自のstdbool.hを作成しました。
#ifndef STDBOOL_H_
#define STDBOOL_H_
/**
* stdbool.h
* Author - Yaping Xin
* E-mail - xinyp at live dot com
* Date - February 10, 2014
* Copyright - You are free to use for any purpose except illegal acts
* Warrenty - None: don't blame me if it breaks something
*
* In ISO C99, stdbool.h is a standard header and _Bool is a keyword, but
* some compilers don't offer these yet. This header file is an
* implementation of the stdbool.h header file.
*
*/
#ifndef _Bool
typedef unsigned char _Bool;
#endif /* _Bool */
/**
* Define the Boolean macros only if they are not already defined.
*/
#ifndef __bool_true_false_are_defined
#define bool _Bool
#define false 0
#define true 1
#define __bool_true_false_are_defined 1
#endif /* __bool_true_false_are_defined */
#endif /* STDBOOL_H_ */
_Bool
はint
またはdouble
によく似たC99の事前定義型です。 int
の定義は、ヘッダーファイルにもありません。
あなたにできることは
_Bool
int
またはunsigned char
)例えば:
#if defined __STDC__ && defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L
/* have a C99 compiler */
typedef _Bool boolean;
#else
/* do not have a C99 compiler */
typedef unsigned char boolean;
#endif
$ echo '_Bool a;' | gcc -c -x c -
$ echo $?
0
$ echo 'bool a;' | gcc -x c -c -
<stdin>:1: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘a’
これは、_Bool
は組み込み型で、bool
は組み込み型ではない単一の変数宣言をコンパイルすることによって組み込み型ではありません。