3

プロジェクトのファイルに #ifndef..#define..#endif を追加すると、コンパイラが失敗します。それを削除するか、他の名前を定義に入れるとすぐに、正常にコンパイルされます。何が問題なのですか?

ファイルは既に宣言されているようですが、どこにあるのかわかりません。削除するだけで結構ですが、なぜこれが起こっているのか本当に知りたいです。

error: expected class-name before ‘{’ token
error: ‘QDesignerFormEditorInterface’ has not been declared

そして、他のいくつかのエラー。

私は実際に Qt の例「カスタム ウィジェット プラグインの例」を使用しています。

違いは、カスタム ウィジェット (.h、.cpp、および .ui ファイル) に独自のクラスを使用していることです。

2つのインクルードを持つファイルに関係している可能性がありますが、それが例のやり方です。

4

2 に答える 2

30

このマクロはインクルード ガードとして使用されますか? もしそうなら、他の場所で使用されている名前を複製しているように聞こえます. これは、インクルード ガードが持たなければならないスコープについて人々が考えていない場合によくある問題です。ファイル名だけでなく、はるかに多くの情報をインクルード ガードに含める必要があります。

ガード ゴールを含める:

  • ヘッダーの作成時に一度生成する
  • 二度と考えなくていい
  • 重複する可能性は、宝くじに当選する可能性よりも低くなります

不適切なインクルード ガード名 (ファイル "config.h" 用):

  • CONFIG_H
    • 一般的すぎる
  • _CONFIG_HCONFIG__HCONFIG_H____CONFIG_H__など
  • PROJECT_CONFIG_H
    • 関係のないプロジェクトで重複する可能性がはるかに低い
    • ただし、パス情報はまだないため、大規模なプロジェクトで簡単に複製できます

適切なインクルード ガード名 (ファイル「config.h」用):

  • PATE_20091116_142045
    • それは<last name>_<date>_<time>
    • プロジェクト、パス、ファイル名の情報さえ必要ありません
    • 入力しやすい
      • エディタに日付の挿入機能がある場合は、非常に高速に「入力」できます
    • 生成しやすい
      • 毎秒複数生成する必要がある場合は、生成時にシーケンス番号を含めます
    • 普遍的にユニークであることの強力な保証
  • INCLUDE_GUARD_726F6B522BAA40A0B7F73C380AD37E6B
    • 実際のUUIDから生成された
      • 普遍的にユニークであることの強力な保証
    • 予期せず発生した場合、「INCLUDE_GUARD」はそれが何であるかについての良いヒントであり、別の名前空間に配置するのに役立ちます(ただし、言語によって認識されるのではなく、慣例による)
    • 必要に応じて、プロジェクト名を先頭に追加します (これは、マクロのプロジェクト ガイドラインでしばしば要求されます)。
    • 生成する独自のサンプル プログラムを簡単に作成できます。
于 2009-11-16T19:26:04.580 に答える
3

既に定義されている定数に forを追加する#ifndefと、常に true と検証されます。「ファイルは宣言されています」と言いますが、ファイルは宣言されません。#ifndef実際には、チェックする必要があるのは、その後に配置する定数です。ソースツリー全体を簡単に検索し、現在の#define表示順序を再確認してください。

そしてもちろん: あなたのコードは正しいですか? ゴミの名前を定数として試して、その#endif直後に配置します。それでもエラーが発生する場合は、タイプミスがあります (そうであれば、コードを貼り付けてください)。この投稿も参照してください。

PS: David Thornley がコメントに同様のアドバイスを入力していたようです...このスレッドの情報と重複していたら申し訳ありません。

于 2009-11-16T19:10:02.007 に答える