Suppress تحذير متغير غير مستخدم في C ++ => علة المترجم أو علة رمز؟

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

سؤال

في الوقت الحاضر، أنا أستخدم قالب الوظيفة التالية لقمع التحذيرات المتغيرة غير المستخدمة:

template<typename T>
void
unused(T const &) {
  /* Do nothing. */
}

ومع ذلك، عند التشغيل إلى Cygwin من Linux، أحصل الآن على أخطاء التحويل البرمجي على G ++ 3.4.4 (على Linux I 3.4.6، لذلك ربما هذا هو إصلاح الأخطاء؟):

Write.cpp: In member function `void* Write::initReadWrite()':
Write.cpp:516: error: invalid initialization of reference of type 'const volatile bool&' from expression of type 'volatile bool'
../../src/common/Assert.h:27: error: in passing argument 1 of `void unused(const T&) [with T = volatile bool]'
make[1]: *** [ARCH.cygwin/release/Write.o] Error 1

الحجة إلى غير المستخدمة هي متغير عضو أعلن على النحو التالي:

  volatile bool readWriteActivated;

هل هذا خطأ مترجم أو خطأ في التعليمات البرمجية الخاصة بي؟

هنا هي حالة الاختبار الحد الأدنى:

template<typename T>
void unused(T const &) { }

int main() {
  volatile bool x = false;
  unused(!x); // type of "!x" is bool
}
هل كانت مفيدة؟

المحلول 3

إنه علة مترجم وليس هناك عمل معروف حول:

http://gcc.gnu.org/bugzilla/show_bug.cgi؟id=42655.

تم إصلاحه في V4.4.

نصائح أخرى

الطريقة الفعلية للإشارة إلى أنك لا تستخدم بالفعل معلمة لا تعطها الاسم:

int f(int a, float) {
     return a*2;
}

سيتم تجميعها في كل مكان مع جميع التحذيرات قيد التشغيل، دون سابق إنذار عن تعويم غير مستخدم. حتى لو كانت الحجة تحتوي على اسم في النموذج الأولي (على سبيل المثال int f(int a, float f);) لا يزال لن يشكو.

أنا لست متأكدا بنسبة 100٪ أن هذا محمول، ولكن هذا هو المصطلح الذي استخدمته عادة لقمع التحذيرات حول المتغيرات غير المستخدمة. السياق هنا هو معالج إشارة يستخدم فقط للقبض SIGINT و SIGTERM, ، لذلك إذا كانت الوظيفة تسمى على الإطلاق، أعلم أنها حان الوقت للخروج من البرنامج.

volatile bool app_killed = false;
int signal_handler(int signum)
{
    (void)signum; // this suppresses the warnings
    app_killed = true;
}

أميل إلى كره تشوش قائمة المعلمة مع __attribute__((unused)), ، نظرا لأن الخدعة الممتازة إلى الفراغ تعمل دون اللجوء إلى وحدات ماكرو ل Visual C ++.

في دول مجلس التعاون الخليجي، يمكنك تحديد ماكرو على النحو التالي:

#ifdef UNUSED
#elif defined(__GNUC__)
# define UNUSED(x) UNUSED_ ## x __attribute__((unused))
#elif defined(__LCLINT__)
# define UNUSED(x) /*@unused@*/ x
#else
# define UNUSED(x) x
#endif 

أي معلمات تتميز بهذا الماكرو ستؤدي إلى قمع تنبعث من دول مجلس التعاون الخليجي غير المستخدمة (وإعادة تسمية المعلمة بادئة UNUSED_). ل Visual Studio، يمكنك قمع التحذيرات مع #pragma التوجيه.

الجواب الذي اقترحه Haavee (المعدل من قبل UR) هو الذي استخدمه عادة:

int f(int a, float /*epsilon*/) {
     return a*2;
}

المشكلة الحقيقية تحدث عندما تكون الوسيطة بعض الأحيان ولكن ليس يستخدم دائما في الطريقة، على سبيل المثال:

int f(int a, float epsilon) {
#ifdef LOGGING_ENABLED
     LOG("f: a = %d, epsilon = %f\n", a, epsilon);
#endif
     return a*2;
}

الآن، لا يمكنني التعليق على اسم المعلمة EPSILON لأنه من شأنه أن كسر بناء التسجيل الخاص بي (لا أريد إدراج #ifdef آخر في قائمة الوساطة لأن هذا يجعل الكود أكثر صعوبة القراءة).

لذلك أعتقد أن أفضل حل سيكون لاستخدام اقتراح توم:

int f(int a, float epsilon) {
(void) epsilon;    // suppress compiler warning for possibly unused arg
#ifdef LOGGING_ENABLED
     LOG("f: a = %d, epsilon = %f\n", a, epsilon);
#endif
     return a*2;
}

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

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