web-dev-qa-db-ja.com

Eclipse CDTが「構文エラー」と言うのはなぜですか、コンパイルは問題ありません

私は、次のようなステートメントを含む数行の既存のCコードで作業しています。

struct collect_conn *tc = (struct collect_conn *) 
     ((char *)c - offsetof(struct collect_conn, runicast_conn));

Struct collect_connは、次の行に沿っています。

struct collect_conn {
  struct runicast_conn runicast_conn;
  struct announcement announcement;
  const struct collect_callbacks *cb;
  struct ctimer t;
  uint16_t rtmetric;
  uint8_t forwarding;
  uint8_t seqno;
};

Eclipse CDTを使用していますが、オレンジ色の波線で行が「構文エラー」としてマークされています。 CDTインデクサーによってそのようにマークされていると思います。ただし、コンパイル(手動で端末で)は問題ありません。

ただし、行の要素にインデックスが付けられないため、これは少し不便です(したがって、呼び出し階層ツリーが常に正しいとは限らず、要素の強調表示など)。

なぜEcipseはその行がそのまま好きではないのですか?

14
Rabarberski

Eclipse CDTには、コードを分析してインデックスを作成するための独自のプリプロセッサ/パーサーが含まれています。ただし、ビルドを呼び出すと、CDTはgccなどのシステムコンパイラを呼び出します。 CDTパーサーで受け入れられる構文とコンパイラーで受け入れられる構文にはわずかな違いがある場合があります。これが発生すると、CDTパーサーが混乱する可能性があります。

私のシステムでは、offsetofマクロは__offsetof__キーワードを使用する式に展開されます。このキーワードはCDTによって認識されないため、構文エラーが発生します。この問題に対処するために、CDTパーサーには次のような__offsetof__を処理するためのマクロが組み込まれています。

#define __offsetof__(x) (x)

これは正しくないようです。少なくとも私のシステムでは、結果としてソースから__offsetof__キーワードが削除され、それでも構文エラーが発生します。

Paths and Symbolsプロパティページに移動し、「foo」にマップする__offsetof__のマクロを追加することで、構文エラーを取り除くことができました。これにより、パーサーは、構文エラーではなく、これまでに見たことのない関数の呼び出しであると考えるようになります。

または、[ウィンドウ]> [設定]> [一般]> [エディター]> [テキストエディター]> [注釈]に移動し、C/C++インデクサーマーカーのすべてのチェックボックスをオフにすることで、エディターでの構文エラーレポートをオフにすることができます。

27
Mike Kucera

EclipseCDTの問題をPreferences-> C/C++-> Language Mappings:Add Content Type:C-header Language:C++で修正しました

9
ra.

CDTパーサーはoffsetof(struct ...)の部分が気に入らないようです。 typedefを使用してcollect_connを宣言すると、エラーはなくなります。少なくとも私にとっては、次のコードが機能します。

typedef struct  {
   struct runicast_conn runicast_conn;
   struct announcement announcement;
   const struct collect_callbacks *cb;
   struct ctimer t;
   uint16_t rtmetric;
   uint8_t forwarding;
   uint8_t seqno;
} collect_conn;
...
struct collect_conn *tc = (struct collect_conn *)
     ((char *)c - offsetof(collect_conn, runicast_conn));

元の宣言を変更できない場合は、次のようにします。

typedef struct collect_conn collect_conn_t;
5
jassuncao

時々、コードはエラーなしでコンパイルされますが、Eclipse CDTのリアルタイムコードアナライザーは、C/C++ファイルにいくつかのエラーを表示します(例: '関数xxxを解決できませんでした)。これは、Eclipse CDTが、MinGWのもの(または他のGNUコンパイラ))の代わりに、コードの分析とインデックスの構築に独自のプリプロセッサ/パーサーを使用するためです。ワークスペース内のプロジェクトについては、次の手順に従ってください:(特定のプロジェクトに対してのみこれを修正するには、メニューの手順1、2、および4に従ってください 'Project-> Preferences ')

1-メニュー 'Window-> Preferences-> C/C++-> Language Mappings'で、以下に示すように正しいマッピングを追加します。コンテンツタイプの場合:C++ソース/ヘッダーファイル、使用GNU C++言語など) グローバル言語マッピング設定

2-メニュー 'Window-> Preferences-> C/C++-> Indexer'で、すべてのチェックボックスをオンにして完全なインデックスを設定します( 'Skip'は除く)以下に示すように: グローバルインデクサー設定

3-各プロジェクトの特定のプロパティで、メニュー 'プロジェクト->プロパティ-> C/C++一般->インデクサー'、[プロジェクト固有の設定を有効にする]のチェックを外します以下に示すように: プロジェクトインデクサー設定

4-インデックスを再構築します。メニュー 'Project-> C/C++ Index->​​ Rebuild'。

3
Hossein

混乱するかもしれません。たとえば、スコープ内にoffsetofの定義があるかどうかを確認してください。それ以外の場合は、式を単純化して、たとえば次のように分割してみてください。 #defineoffset、または何か。

コンパイラーはoffsetofの組み込みバージョンを提供するかもしれないが、Eclipseのコンパイラー/コードパーサーは提供しないかもしれないと私は考えています。その場合、Eclipseがコードを適切に解析できるようにするには、定義があることを確認する必要があります。

2
unwind

環境設定-> c/C++->インデクサーでインデクサーを「完全なc/C++インデクサー(完全な解析)」に切り替えてみてください

2
peter

Ivも同じ問題を抱えています。 offsetofには2つの定義があります(1つはC用、もう1つはC++用)。 IMOの問題はそこから来ています

たとえば、私が入力した場合

#ifndef __cplusplus
#endif

Eclipseはそれを灰色にします。 __cplusplusが定義されていることを意味しますが、私のプロジェクトはCです

残念ながら、私は修正を見つけられません。

1
foo

私はこのような問題を解決することになった。最初にプロジェクトのプロパティを開き、次にC/C++の[一般]-> [パスとシンボル]カテゴリを開きました。 [シンボル]タブで、次のエントリを追加しました。

Symbol: offsetof(TYPE,MEMBER)
Value: ((ssize_t) &((TYPE *)0)->MEMBER)

これらのシンボルはインデクサーによって使用されますが、コンパイラーには渡されません(少なくとも、Makefileプロジェクトでは、他の種類のCプロジェクトでは試していません)。したがって、GCCの組み込みoffsetofをオーバーライドしません。

1
Jeremy List

新しいCDTプロジェクトウィザードのMakefileプロジェクトのエラーパーサータブをチェックし、CDT Visual Cエラーパーサーを削除した後、同様の問題を修正しました(gccを使用しています)

1
peter

Eclipseがこれを行うのを何度か見たことがあり、Javaに使用しています。通常、ファイルを閉じて再度開くと、ファイルが修正されます(問題があればリセットします)。通常、そこにあったのはエラーのようですが、修正されており、「エラーキャッシュ」が正しく更新されていません。

0
MBCook