私は、次のようなステートメントを含む数行の既存の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はその行がそのまま好きではないのですか?
Eclipse CDTには、コードを分析してインデックスを作成するための独自のプリプロセッサ/パーサーが含まれています。ただし、ビルドを呼び出すと、CDTはgccなどのシステムコンパイラを呼び出します。 CDTパーサーで受け入れられる構文とコンパイラーで受け入れられる構文にはわずかな違いがある場合があります。これが発生すると、CDTパーサーが混乱する可能性があります。
私のシステムでは、offsetof
マクロは__offsetof__
キーワードを使用する式に展開されます。このキーワードはCDTによって認識されないため、構文エラーが発生します。この問題に対処するために、CDTパーサーには次のような__offsetof__
を処理するためのマクロが組み込まれています。
#define __offsetof__(x) (x)
これは正しくないようです。少なくとも私のシステムでは、結果としてソースから__offsetof__
キーワードが削除され、それでも構文エラーが発生します。
Paths and Symbolsプロパティページに移動し、「foo」にマップする__offsetof__
のマクロを追加することで、構文エラーを取り除くことができました。これにより、パーサーは、構文エラーではなく、これまでに見たことのない関数の呼び出しであると考えるようになります。
または、[ウィンドウ]> [設定]> [一般]> [エディター]> [テキストエディター]> [注釈]に移動し、C/C++インデクサーマーカーのすべてのチェックボックスをオフにすることで、エディターでの構文エラーレポートをオフにすることができます。
EclipseCDTの問題をPreferences-> C/C++-> Language Mappings:Add Content Type:C-header Language:C++で修正しました
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;
時々、コードはエラーなしでコンパイルされますが、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'。
混乱するかもしれません。たとえば、スコープ内にoffsetof
の定義があるかどうかを確認してください。それ以外の場合は、式を単純化して、たとえば次のように分割してみてください。 #define
とoffset
、または何か。
コンパイラーはoffsetof
の組み込みバージョンを提供するかもしれないが、Eclipseのコンパイラー/コードパーサーは提供しないかもしれないと私は考えています。その場合、Eclipseがコードを適切に解析できるようにするには、定義があることを確認する必要があります。
環境設定-> c/C++->インデクサーでインデクサーを「完全なc/C++インデクサー(完全な解析)」に切り替えてみてください
Ivも同じ問題を抱えています。 offsetofには2つの定義があります(1つはC用、もう1つはC++用)。 IMOの問題はそこから来ています
たとえば、私が入力した場合
#ifndef __cplusplus
#endif
Eclipseはそれを灰色にします。 __cplusplusが定義されていることを意味しますが、私のプロジェクトはCです
残念ながら、私は修正を見つけられません。
私はこのような問題を解決することになった。最初にプロジェクトのプロパティを開き、次にC/C++の[一般]-> [パスとシンボル]カテゴリを開きました。 [シンボル]タブで、次のエントリを追加しました。
Symbol: offsetof(TYPE,MEMBER)
Value: ((ssize_t) &((TYPE *)0)->MEMBER)
これらのシンボルはインデクサーによって使用されますが、コンパイラーには渡されません(少なくとも、Makefileプロジェクトでは、他の種類のCプロジェクトでは試していません)。したがって、GCCの組み込みoffsetofをオーバーライドしません。
新しいCDTプロジェクトウィザードのMakefileプロジェクトのエラーパーサータブをチェックし、CDT Visual Cエラーパーサーを削除した後、同様の問題を修正しました(gccを使用しています)
Eclipseがこれを行うのを何度か見たことがあり、Javaに使用しています。通常、ファイルを閉じて再度開くと、ファイルが修正されます(問題があればリセットします)。通常、そこにあったのはエラーのようですが、修正されており、「エラーキャッシュ」が正しく更新されていません。