web-dev-qa-db-ja.com

stdbool.hはどこにありますか?

私のシステムで_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も検出しません。

それはどこにあるのでしょうか?

22
James Morris

_Boolは組み込み型なので、システムヘッダーファイルであっても、その定義がヘッダーファイルにあるとは思わないでください。

そうは言っても、検索しているパスからシステムを推測すると、/usr/lib/gcc/*/*/include

私の「本当の」stdbool.h そこに住んでいます。さすが#defines bool_Bool。なので _Boolはコンパイラーにネイティブなタイプであり、ヘッダーファイルには定義されていません。

13
CB Bailey

注として:

_BoolはC99で定義されています。プログラムを次のように作成した場合:

gcc -std=c99

あなたはそれがそこにあると期待することができます。

7
pbos

他の人々は_Boolの場所に関する質問に回答し、C99が宣言されているかどうかを見つけました...しかし、私は誰もが行った自作の宣言に満足していません。

タイプを完全に定義しないのはなぜですか?

typedef enum { false, true } bool;
4
Adrien Plisson

一部のコンパイラーは_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_ */
2
Yaping Xin

_Boolintまたはdoubleによく似たC99の事前定義型です。 intの定義は、ヘッダーファイルにもありません。

あなたにできることは

  • コンパイラがC99であることを確認してください
  • 使用する場合は_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
2
pmg
$ 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は組み込み型ではない単一の変数宣言をコンパイルすることによって組み込み型ではありません。

0
Matt Joiner