تعطيل تحذيرات دول مجلس التعاون الخليجي بشكل انتقائي لجزء فقط من وحدة الترجمة؟

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

سؤال

ما هو أقرب دول مجلس التعاون الخليجي ما يعادل رمز Preprocessor MSVC هذا؟

#pragma warning( push )                    // Save the current warning state.
#pragma warning( disable : 4723 )          // C4723: potential divide by 0
// Code which would generate warning 4723.
#pragma warning( pop )                     // Restore warnings to previous state.

لدينا رمز في رؤوس شاملة يشمل أننا لا نريد إنشاء تحذير محدد. ومع ذلك، نريد أن نواجه الملفات التي تضم تلك الرؤوس لمواصلة توليد هذا التحذير (إذا كان المشروع يحتوي على تمكين التحذير).

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

المحلول

هذا هو ممكن في دول مجلس التعاون الخليجي منذ الإصدار 4.6، أو حوالي يونيو 2010 في الجذع.

إليك مثال:

#pragma GCC diagnostic push
#pragma GCC diagnostic error "-Wuninitialized"
    foo(a);         /* error is given for this one */
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wuninitialized"
    foo(b);         /* no diagnostic for this one */
#pragma GCC diagnostic pop
    foo(c);         /* error is given for this one */
#pragma GCC diagnostic pop
    foo(d);         /* depends on command line options */

نصائح أخرى

أقرب شيء هو دول مجلس التعاون الخليجي براغما, #pragma GCC diagnostic [warning|error|ignored] "-Wwhatever". وبعد إنه ليس قريبا جدا من ما تريد، ورؤية الرابط للحصول على التفاصيل والتحذير.

لقد فعلت شيئا مشابها. للحصول على رمز الطرف الثالث، لم أكن أرغب في رؤية أي تحذيرات على الإطلاق. لذلك، بدلا من تحديد -I/path/to/libfoo/include, ، انا إستعملت -isystem /path/to/libfoo/include. وبعد هذا يجعل المحول البرمجي يعامل مع ملفات الرأس هذه ك "رؤوس النظام" لغرض التحذيرات، طالما أنك لا تمكن -Wsystem-headers, ، أنت في الغالب آمنة. ما زلت شهدت بعض التحذيرات تسرب من هناك، لكنها تخترق معظم غير المرغوب فيه.

لاحظ أن هذا فقط يساعدك إذا كنت تستطيع عزل الرمز المخالف حسب الدليل التضمين. إذا كانت مجرد مجموعة فرعية من المشروع الخاص بك، أو intermixed مع رمز آخر، فأنت خارج الحظ.

هذا هو التوسع ل إجابة نجار مات.

إذا كنت لا ترغب في تلبيد البريغما في جميع أنحاء التعليمات البرمجية الخاصة بك، فيمكنك استخدام _pragma المشغل:

#ifdef __GNUC__
#  define DIAGNOSTIC_ERROR(w) _Pragma("GCC diagnostic error \"" w "\"")
#  define DIAGNOSTIC_IGNORE(w) _Pragma("GCC diagnostic ignore \"" w "\"")
#  define DIAGNOSTIC_PUSH _Pragma("GCC diagnostic push")
#  define DIAGNOSTIC_POP _Pragma("GCC diagnostic pop")
#endif
// (...)

DIAGNOSTIC_ERROR("-Wuninitialized")
foo(a); // Error

DIAGNOSTIC_PUSH
DIAGNOSTIC_IGNORE("-Wuninitialized")
foo(a); // No error

DIAGNOSTIC_POP
foo(a); // Error
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top