3

config.h ヘッダー ファイルは内部ヘッダー ファイルと見なす必要があることを理解しています。config.h 自体を公開せずに、config.h の設定に依存するものを公開する方法を知りたいです。

boolたとえば、 stdbool.h または の適切な定義に応じて、 を返すパブリック関数があるとしboolます。これは public ヘッダー内で宣言する必要がありますが、このヘッダーは stdbool.h のない環境で使用でき、場合によっては config.h がなくても、bool の存在について何も言わない config.h を使用してもかまいません。

次のような不十分な解決策を思いつきました。

#if HAVE_STDBOOL_H || !HAVE_CONFIG_H
# include <stdbool.h>
#endif
#if !__bool_true_false_are_defined
# if !HAVE__BOOL
  typedef int _Bool;
# endif
  typedef _Bool bool;
# define true (bool)1
# define false (bool)0
#endif

extern bool public_bool(void);

これはほとんどの標準的なケースで機能するはずですが、他の多くのケースでは失敗する可能性があります。

今日、 stdbool.h をまったく考慮しない環境を考慮するのは時代遅れかもしれませんが(わかりません)、これは autotool に関する私の理解のギャップのほんの一例です。一般的に問題に対処するためのベストプラクティスは何ですか?

4

2 に答える 2

4

の特定のケースでは、C (または C++) コンパイラに依存する<stdbool.h>ことを避け、依存することを選択して、何が問題ないかを教えてくれました。config.hコードにはこのヘッダーが含まれており、このヘッダーによって混乱が整理されます。Mac OS X、Linux、Solaris、HP-UX、AIX、Windows で動作することが知られています。実際のヘッダー ファイル名は ではありませんourbool.hが、ヘッダー ガードとコメントを壊して、そう呼ばれているように見せました。コメントは、C99 標準を引用して、ライセンスがそのように機能するようにします。<stdbool.h>がすでに含まれている場合も正しく動作し、含まれた後に が含まれている場合も正しく動作することに注意してください<stdbool.h>(これを正しくするのに 100% 苦労することはありませんでした)。定義する__bool_true_false_are_definedは、この相互作用に不可欠です。<stdbool.h>(あなたのコードが他の人によって使用されている場合、ヘッダーが含まれる前でも後でも、他の人が自分自身を使用しないように強制することはできません。)

#ifndef OURBOOL_H_INCLUDED
#define OURBOOL_H_INCLUDED

/*
** Ensure that type bool with constants false = 0 and true = 1 are defined.
** C++ (ISO/IEC 14882:1998/2003/2011) has bool, true and false intrinsically.
** C (ISO/IEC 9899:1999) has bool, true and false by including <stdbool.h>
** C99 <stdbool.h> also defines __bool_true_false_are_defined when included
** MacOS X <dlfcn.h> manages to include <stdbool.h> when compiling without
** -std=c89 or -std=c99 or -std=gnu89 or -std=gnu99 (and __STDC_VERSION__
** is not then 199901L or later), so check the test macro before defining
** bool, true, false.  Tested on MacOS X Lion (10.7.1) and Leopard (10.5.2)
** with both:
**      #include "ourbool.h"
**      #include <stdbool.h>
** and:
**      #include <stdbool.h>
**      #include "ourbool.h"
**
** C99 (ISO/IEC 9899:1999) says:
**
** 7.16 Boolean type and values <stdbool.h>
** 1 The header <stdbool.h> defines four macros.
** 2 The macro
**       bool
**   expands to _Bool.
** 3 The remaining three macros are suitable for use in #if preprocessing
**   directives.  They are
**       true
**   which expands to the integer constant 1,
**       false
**   which expands to the integer constant 0, and
**       __bool_true_false_are_defined
**   which expands to the integer constant 1.
** 4 Notwithstanding the provisions of 7.1.3, a program may undefine and
**   perhaps then redefine the macros bool, true, and false.213)
**
** 213) See 'future library directions' (7.26.7).
**
** 7.26.7 Boolean type and values <stdbool.h>
** 1 The ability to undefine and perhaps then redefine the macros bool, true,
**   and false is an obsolescent feature.
**
** Use 'unsigned char' instead of _Bool because the compiler does not claim
** to support _Bool.  This takes advantage of the license of paragraph 4.
*/

#if !defined(__cplusplus)

#if __STDC_VERSION__ >= 199901L
#include <stdbool.h>
#elif !defined(__bool_true_false_are_defined)
#undef bool
#undef false
#undef true
#define bool    unsigned char
#define false   0
#define true    1
#define __bool_true_false_are_defined 1
#endif

#endif /* !_cplusplus */

#endif /* OURBOOL_H_INCLUDED */

明らかに、 の可能性を考慮したい場合はHAVE_STDBOOL_H、そうすることができますが、必要ありません。が定義されている場合にどうするかを決定することもできますがHAVE_CONFIG_H、これも必要ありません。

これを使用するには、ヘッダーに次の内容を含めます。

#ifndef YOURHEADER_H_INCLUDED
#define YOURHEADER_H_INCLUDED
...other #includes as needed...
#include "ourbool.h"      /* Or #include "project/ourbool.h" */
...other material...

extern bool boolean_and(bool lhs, bool rhs);

...other material...
#endif /* YOURHEADER_H_INCLUDED */

ourbool.hinの正確な位置は、その型yourheader.hを使用する型、関数、または (考えを捨てる) 変数を宣言する前である限り、重要ではありませんbool

于 2012-08-29T00:21:00.770 に答える
3

構成時に検出されなかったイベントで、パブリックにインストールされたヘッダーでbooltrue、および自分自身を定義することは、非常に悪い考えのようです。この特定の状況では、解決策は、ライブラリのユーザーがすべて準拠する C99 以降の環境を持っていると想定できない限り、パブリック インターフェイスの一部として使用しないことだと思います。すべての慣用的な C コードと同様に、 を使用すると、問題が完全に解消されます。falsestdbool.hboolint

boolそうは言っても、ライブラリが構成された環境に応じて、インストールされたヘッダーが異なる動作をする正当な必要性がある場合に関係しない場合に適用される、対処すべき一般的な問題もあります。その場合、最適な解決策は、ヘッダーをビルドシステムによって作成された生成ファイルにすることです (たとえばmylib.h.in、autoconf を使用)。これは、ビルド対象のシステムに一致するように設定されています。

于 2012-08-28T23:35:38.427 に答える