4

最初に私の説明をしなければなりません...

状況

  • stdbool.hは明らかに利用できないため、特に VC++ および C# の現在の IDE である Visual Studio 2008 では利用できないため、次の内容のbool.hを含むこのマイクロコントローラー コード (プレーンな古いC ) があります(以下を参照)。

    #ifndef CUSTOM_BOOL
    #define CUSTOM_BOOL
    
    #ifdef __cplusplus
    extern "C" {
    #endif // #ifdef __cplusplus
    
    #ifndef bool
    #define bool unsigned char
    #endif
    
    #ifndef true
    #define true 1
    #endif
    
    #ifndef false
    #define false 0
    #endif
    
    #ifdef __cplusplus
    }
    #endif // #ifdef __cplusplus
    
    #endif // #ifndef CUSTOM_BOOL
    
  • ここで、そのマイクロコントローラー コードの機能がC# Projectに必要です。そのため、特定のマイクロコントローラー コードをラップするマネージ クラスを含む中間Visual C++ プロジェクトを作成しました。

  • このラッパー プロジェクト (VC++) は C コードをいじるので、#include "bool.h"(間接的な方法で、それ自体が bool.h を含む別のヘッダーが含まれることを意味しますが、それは重要ではない詳細だと思います)。今ここに私の...

問題

bool.hは VC++ プロジェクトに含まれており、このプロジェクトは「実数」の bool を返す関数を提供する必要があるため (ここでの「実数」とは、VC++ プロジェクトを使用するときに C# によって bool として認識される型を意味します)、残念ながらbool、VC++ コードの もプリプロセッサによってキャッチされるため、 に置き換えられunsigned charます。ここで何が起こるかというと、C# は最後に、unsigned char から bool への変換は許可されていないと文句を言います。これはすべて問題ありません。なぜこれが起こるのか理解しています。だからここに私の...

質問

この問題を「クリーンな」方法で解決するにはどうすればよいですか。私の現在の解決策は、bool.h をインクルードした後、VC++ コードが開始する直前に、次のように bool とその友人を再び定義解除することです。

#ifdef bool
#undef bool
#endif

#ifdef true
#undef true
#endif

#ifdef false
#undef false
#endif

それは機能しますが、それは私の適切なプログラミング方法の心を壊します。これを修正する適切な方法はありますか?それとも、問題はおそらく以前に発生していますか?BOOL代わりにのようなものを定義する必要がありboolますか? interwebz で検索したところ、誰もが同意するCプロジェクト (C99 はサポートされていません) で bool (または BOOL?) を定義する一般的な「標準」の方法はありません。

4

3 に答える 3

1

つまり、マイクロコントローラー プロジェクトが新しいデータ型を作成し、それを bool と呼んでいるように聞こえますが、bool が (true と false と共に) キーワードになったので競合が発生しましたか? 私の提案(優先順)は次のとおりです。

解決策 1: マイクロコントローラー プロジェクトを修正します。グローバル検索を実行し、bool を置き換えて、論争の少ないものに置き換えます。おそらく、C_Boolean、C_True、および C_False です。将来の競合が発生する可能性は低く、正規表現を使用するのはかなり簡単です。

解決策 2: マイクロコントローラー プロジェクトを C++ に変換します。これにより、bool、true、および false (キーワードとして) を直接使用でき、マクロを削除できます。マイクロコントローラ コードが c++ と互換性のない構文を使用している場合、これは困難な場合があります。

解決策 3: すでに行ったことを実行します。マイクロコントローラー コードをインクルードした後にクリーンアップするラッパー インクルードを作成します。extern キーワードの再定義に依存するコードがありますが、これが唯一の安全な方法です。ただし、壊れやすいです...将来、関係のない何かがインクルード構造を壊したときに修正する必要があります。

また、元の作成者が extern "C" ラッパーが何をしていると信じているかはわかりませんが、定義されているマクロには影響しません。影響を与える可能性のあるものをいくつか切り取るかもしれませんが、マクロはリンカーの命名規則の影響を受けません。

于 2013-08-20T16:03:00.127 に答える
0

Keith Thompson (質問の下のコメント) と Speed8ump の回答のおかげで、別のアイデアが得られました。

bool.h:

#ifndef CUSTOM_BOOL
#define CUSTOM_BOOL

#ifndef __cplusplus

#ifndef bool
#define bool unsigned char
#endif

#ifndef true
#define true 1
#endif

#ifndef false
#define false 0
#endif

#endif // #ifndef __cplusplus
#endif // #ifndef CUSTOM_BOOL

魅力のように機能し、以前の定義されていないものよりもクリーンなソリューションだと思います。それでも、お気軽にコメントするか、より多くの/より良い回答を提供してください.

于 2013-08-20T16:24:41.967 に答える