لماذا يقول Eclipse CDT:"خطأ في بناء الجملة"، ولكن التجميع لا توجد مشكلة

StackOverflow https://stackoverflow.com/questions/802410

  •  03-07-2019
  •  | 
  •  

سؤال

أنا أعمل في كود C الحالي الذي يحتوي على سطرين يحتويان على عبارات مشابهة لهذه:

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

تسير البنية 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 الخط كما هو؟

هل كانت مفيدة؟

المحلول

والكسوف CDT يحتوي الخاصة به المعالج / محلل لتحليل الشفرة الخاصة بك وبناء فهرس. ومع ذلك، عند استدعاء بناء CDT يدعو إلى مترجم النظام الخاص بك، مثل دول مجلس التعاون الخليجي على سبيل المثال. قد تكون هناك اختلافات طفيفة بين بناء الجملة التي قبلها محلل CDT وبناء الجملة مقبولة من قبل المترجم الخاص بك. وعندما يحدث هذا محلل CDT يمكن الحصول على الخلط.

في نظام بلدي يوسع الماكرو offsetof إلى تعبير يستخدم الكلمة __offsetof__. لم يتم التعرف على هذه الكلمة التي CDT ولهذا السبب هناك خطأ في بناء الجملة. للتعامل مع هذه المشكلة محلل CDT تمت ماكرو بنيت في التعامل مع __offsetof__ الذي يبدو مثل هذا:

#define __offsetof__(x) (x)

وهذا لا يبدو أن يكون صحيحا، على الأقل على نظام بلدي والنتيجة هي إزالة الكلمة __offsetof__ من المصدر الذي لا يزال يؤدي إلى خطأ في بناء الجملة.

وكنت قادرا على التخلص من خطأ في بناء الجملة عن طريق الذهاب إلى صفحة الخصائص مسارات والرموز وإضافة ماكرو ل__offsetof__ التي تقوم بتعيين إلى "فو". هذه الحيل محلل في التفكير لمجرد استدعاء دالة أنها لم تشاهد من قبل، ولكن ليس خطأ في بناء الجملة.

وبدلا من ذلك يمكنك إيقاف تركيب التقرير عن الخطأ في المحرر عن طريق الذهاب الى نافذة> تفضيلات> عام> المحررين> محررات النصوص> الشروح وإلغاء جميع خانات لC / C ++ مفهرس علامات.

نصائح أخرى

مشكلة

ولقد الثابتة في الكسوف CDT مع تفضيلات> C / C ++ - تعيينات> اللغة: إضافة نوع المحتوى: C-رأس اللغة: C ++

ويبدو محلل CDT لا يحب جزء offsetof (البنية ...). إذا قمت بتعريف collect_conn باستخدام typedef ويختفي الخطأ. على الأقل بالنسبة لي، تعمل التعليمة البرمجية التالية:

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;

ويمكن الخلط بينه و، معرفة ما اذا كان لديك تعريف offsetof في النطاق، على سبيل المثال. وإلا فإنك قد تحاول تبسيط التعبير وكسرها حتى باستخدام مثل و#define مع offset، أو شيء ما.

وأنا أفكر المترجم قد توفر المدمج في نسخة من offsetof، في حين قد لا مترجم / رمز محلل الكسوف و. إذا كان الأمر كذلك، وكنت بحاجة للتأكد من أن لديك تعريف، لكسوف الشمس لتكون قادرة على تحليل صحيح التعليمات البرمجية.

وحاول تبديل مفهرس إلى "ج الكاملة / C ++ مفهرس (تحليل كامل)" في تفضيلات> ج / C ++ -> مفهرس

في بعض الأحيان، على الرغم من أن التعليمات البرمجية يتم تجميعها بدون أي خطأ، فإن محلل التعليمات البرمجية في الوقت الحقيقي لـ 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++->إعادة البناء'.

ورابعا حصلت على نفس المشكلة. هناك 2 تعريف offsetof (واحد C واحد لC ++). IMO المشكلة تأتي من أن

وعلى سبيل المثال لو كنت اكتب

#ifndef __cplusplus
#endif

والكسوف والرمادي ذلك. يعني يتم تعريف __cplusplus، ولكن مشروعي هو C

للأسف أنا لا تجد الإصلاح.

وأنا ثابت مشكلة مماثلة بعد التحقق من موزعي علامة التبويب خطأ في مشروع ماكيفيلي في معالج مشروع جديد CDT، وإزالة CDT مرئي C محلل خطأ (أستخدمه دول مجلس التعاون الخليجي)

وانتهى بي الأمر حل مشكلة من هذا القبيل. أولا فتحت خصائص المشروع، ثم / C ++ general-> مسارات والرموز الفئة C. تحت علامة التبويب رموز أضفت هذا الموضوع:

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

وتستخدم هذه الرموز من قبل مفهرس ولكن ليس تمريرها إلى مترجم (على الأقل في مشاريع ماكيفيلي، لم أحاول ذلك في نوع آخر من مشروع C)، لذلك لا يلغي دول مجلس التعاون الخليجي الذي بني في offsetof

ورأيت الكسوف القيام بذلك في بعض الأحيان، وأنا استخدامها لجاوا. عادة إغلاق وفتح الملف مرة أخرى يصلح له بالنسبة لي (يعيد كل ما هو خاطئ). وعادة ما يبدو أن خطأ أن هناك ولكن تم إصلاح و"مخبأ الخطأ" لم يتم تحديثها بشكل صحيح.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top