15

私は、これに似たステートメントを含む数行の既存の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はその行がそのまま好きではないのですか?

4

10 に答える 10

28

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

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

#define __offsetof__(x) (x)

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

__offsetof__[パスとシンボル]プロパティページに移動し、「foo」にマップするマクロを追加することで、構文エラーを取り除くことができました。これは、パーサーをだまして、これまでに見たことのない関数の呼び出しであると考えさせますが、構文エラーではありません。

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

于 2009-05-07T14:35:15.293 に答える
10

EclipseCDTの問題を[設定]->[C/ C ++]-> [言語マッピング]で修正しました:コンテンツタイプの追加:Cヘッダー言語:C ++

于 2012-10-05T16:06:00.867 に答える
8

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

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

2-メニューの「ウィンドウ」->「設定」->「 C/C ++」->「インデクサー」で、以下に示すように、すべてのチェックボックス(「スキップ」チェックボックスは除く)をチェックして完全なインデックスを設定します。 グローバルインデクサー設定

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

4-インデックスを再構築します。メニュー'プロジェクト->C/C++インデックス->再構築'。

于 2018-05-02T06:05:23.787 に答える
5

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;
于 2009-04-29T13:56:52.723 に答える
2

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

于 2009-10-26T17:18:12.283 に答える
2

混乱する可能性がありoffsetofます。たとえば、範囲内の定義があるかどうかを確認してください。それ以外の場合は、式を単純化して、たとえばa#defineoffsetofなどを使用して式を分割してみてください。

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

于 2009-04-29T13:47:07.193 に答える
1

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

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

#ifndef __cplusplus
#endif

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

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

于 2009-04-29T21:44:05.563 に答える
1

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

于 2011-08-10T12:30:11.563 に答える
1

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

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

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

于 2012-12-06T02:36:35.700 に答える
0

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

于 2009-04-29T13:51:11.583 に答える