0

私のプロジェクトには、多数のユーザー定義型 ( ) を持つスタックが組み込まれていますtypedef。問題は、これらの型定義の多くが社内の型定義と競合することです。つまり、同じシンボル名が使用されています。これを防ぐ方法はありますか?

問題の根本は、場合によってはアプリケーションまたはラッパー コードでスタックを使用するために、特定のヘッダー ファイルをインクルードする必要があることです。このスタック ヘッダー ファイルには、スタック プロバイダーの型定義ファイルが含まれます。それが問題です。非公開のインクルード パスを介して型定義ファイルをインクルードする必要がありましたが、インクルードしていませんでした。BYTE現在、WORD、、 などの非常に一般的な名前に対して、あらゆる種類のユーザー定義型の競合が発生しDWORDています。

4

3 に答える 3

1

おそらく、使用しているプログラム スタックを簡単に変更することはできないため、独自のコードから始める必要があります。

最初に行うことは、(明らかに) グローバル名前空間内の名前の数を可能な限り制限することです。例として、グローバル変数を使用しないでください。静的変数のみを使用してください。

次のステップは、コード モジュールの命名規則を採用することです。プロジェクトに「入力モジュール」があるとします。次に、たとえば、入力モジュール「inp」のすべての関数にプレフィックスを付けることができます。

void inp_init (void); 
void inp_get  (int input);

#define INP_SOMECONSTANT 4

typedef enum
{
  INP_THIS,
  INP_THAT,
} inp_something_t;

等々。これらの項目がコードの他の場所で使用される場合は常に、一意の識別子を持つだけでなく、それらがどのモジュールに属しているか、したがってそれらがどのような目的を持っているかが読者に明らかになります。したがって、名前空間の競合を修正しながら、同時に可読性を得ることができます。

上記のようなことは、正式なコーディング標準を実装するための最初のステップになる可能性があり、いずれにしてもプロのプログラマーとして遅かれ早かれ行う必要があります。

于 2012-11-06T22:26:11.267 に答える
0

当分の間、合理的な回避策を思いついたと思いますが、Lundin が述べたように、長期的な解決策には正式なコーディング標準が必要です。

基本的に私がしたことは、必要なスタック ヘッダー ファイルのインクルードを、社内の型定義ファイルのインクルードの前に移動することでした。次に、これら 2 つのインクルードの間にコンパイラ マクロを追加して、スタックのヘッダー ファイルのシングル インクルード保護定義が定義されているかどうかに応じて定義済みの定数を設定しました。次に、競合するデータ型が再定義されるのを防ぐために、その条件付きで定義された定数を社内の型定義ファイルの条件付きコンパイル オプションとして使用しました。少しずさんですが、段階的にしか進められません。

于 2012-11-06T23:32:43.370 に答える
0

独自の型に関して、スタックによってエクスポートされたすべての関数と構造を再定義するラッピング ヘッダーを定義することをお勧めします。このヘッダーは、システム ファイルには含まれますが、スタック ファイルには含まれません (競合する場所)。その後、コンパイルしてリンクできますが、インターフェイスに弱点があります。再定義でタイプを正しく選択すると、スタック サプライヤーからの更新ごとにメンテナンスの問題だけが残り、正しく動作するはずです...

于 2012-11-06T22:33:10.780 に答える