4

を含むいくつかのコードをテストしたところ、またはterm.hなどの通常の識別子を使用していくつかの奇妙なエラーが発生しました。これは、このヘッダーが多くのマクロを定義しているという事実に由来します。ここではいくつかの例を示します。tabcolumns

/* from term.h */

#define columns                        CUR Numbers[0]
#define lines                          CUR Numbers[2]
#define bell                           CUR Strings[1]
#define insert_line                    CUR Strings[53]
#define tab                            CUR Strings[134]

ただし、これらのマクロ定数に関するドキュメントは見つかりませんでした。TERMINALデータ構造の一部のメンバーにアクセスするためのショートカットのようです。もちろん、解決策は#undefソース コードで使用されるすべての識別子にあります。しかし、それは非常に制限的です。

だから私の質問は: の識別子にプレフィックスを付けないのはなぜterm.hですか?
実際のソース コードではローカル変数として使用されることが多いため、理解不能なエラーが発生します。

4

2 に答える 2

5

識別子の競合に対処するには、次の 2 つの方法があります。

  1. の識別子を変更しますterm.h
  2. コード内の識別子を変更する

1つ目は、説明する必要がないことを願っています。term.hコードが脳内で思考として形成されるずっと前から存在していたのです。したがって、競合する識別子を作成したのは完全にあなたの責任^W問題^責任です。:-)

多分別のオプションがあります:

  • そもそも使用/含めないterm.hでください。
于 2012-12-23T18:28:07.487 に答える
1

term.h を使用する必要があると仮定すると、1 つのオプションは、そのファイルのインクルードを特定のモジュールに分離して、コード全体が衝突しないようにすることです。しかし、Jens が言うように、「名前が衝突しないようにする」のはあなたの仕事です。システムに属するパブリック ヘッダー ファイルは、同じ名前を使用しているという理由だけで変更しないでください。

于 2012-12-23T19:04:21.100 に答える