0

そのため、私はまだこの大きなプロジェクトに取り組んでおり、Linux でコンパイルできるようにしています。そのため、存在を許可してはならないエラーが発生しました。

ここに私が得たいくつかのエラーがあります:

(1) error: expected identifier before numeric constant
(2) error: "Value" doesn't name a type

これらのエラーがどこで発生するかを示す単純化されたコードのサンプルを次に示します。

class Test
{
public:
  enum Value
  {
    V1 = 0,  // error (1) is here
    V2 = 1,
    V3 = 2
  };

private:
  Value value; // error (2) is here

public:
  // constructor and other function
};

また、そのコードはプロジェクトの一部で有効です。しかし、それは他の部分にはありません。私はすべてを行いました。あいまいではないことを確認するために名前を変更し、何も変更しません。

GCC 4.1.2 で立ち往生

4

1 に答える 1

7

フラグメントはg++4.4.3で正常にコンパイルされ、g++4.1.2でも正常にコンパイルされると思います。

あなたが遭遇したのは、#define定数を使用することがC++で行うのは根本的に邪悪なことである理由です。インクルードしたヘッダーファイルの1つに、次のような行が組み込まれています。

#define V1 42

最速の解決策は

#undef V1

しかし、誰かが悪意を持っているのであれば、私はあなたの将来についても#define V1同様の定義を感じます。私の個人的な経験では、X11ヘッダーの多くは、このようなプリプロセッサ定義の導入に広く関与しています。V2V3windows.h

問題のあるヘッダーを追跡するためのアドバイスを提供したいのですが、通常はgrepを使用したり、削除したときにエラーが解消されるヘッダーを確認したりします。

私たちがこの問題に遭遇したとき、私たちの一般的な習慣は

  • 問題のあるヘッダーが含まれる場所の数を最小限に抑え、ヘッダーファイルに含めないでください。
  • 問題のあるすべての定数を含む「安全な」ラッパーヘッダーを作成し、#undef必要に応じてより合理的なものに置き換えます。
于 2012-05-24T14:27:38.623 に答える