سؤال

وأنا أعلم أن #تحذير التوجيه غير القياسية ج/C++, ولكن العديد من المجمعين الدعم ، بما في ذلك دول مجلس التعاون الخليجي/g++.ولكن تلك التي لا تدعم ذلك ، فإنها بصمت تجاهله أو سوف يؤدي إلى تجميع الفشل ؟ وبعبارة أخرى ، هل يمكنني استخدامه بأمان في المشروع دون كسر بناء على المجمعين لا يعتمد عليه ؟

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

المحلول

فمن المرجح أنه إذا كان المترجم لا يدعم #تحذير, بعد ذلك سوف المسألة خطأ.على عكس #pragma هناك أي توصية المعالج تجاهل توجيهات أنه لا يفهم.

وقد قلت ذلك, لقد استعملت المجمعين على مختلف (معقول المشتركة) منصات لديهم كل الدعم #تحذير.

نصائح أخرى

وتجدر الإشارة إلى أن MSVC يستخدم بناء الجملة:

#pragma message ( "your warning text here" )

المعتادة #تحذير جملة يولد خطأ فادح

C1021: invalid preprocessor command 'warning'

لذلك ليس المحمولة إلى أولئك المجمعين.

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

هل أنت على علم (هل الاسم) مترجم أخرى من دول مجلس التعاون الخليجي/G++ التي توفر #تحذير ؟ [تحرير: Sun Solaris 10 (Sparc) و الاستوديو 11 C/C++ compilers كل قبول #تحذير.]

كان لي هذه المشكلة مرة واحدة مع مترجم على اتميل المعالج.وأنه لم تولد المعالج الأخطاء بسبب غير معروف #تحذير رمزية.

للأسف الحل على ما يبدو إلى تحويل كل شجرة المصدر إلى استخدام #pragma ما يعادل وتقبل أن بناء السلوك سوف تختلف في حالة استخدام دول مجلس التعاون الخليجي.

عند التبديل من مينغو إلى visual studio, لقد تم إضافة هذه الأسطر إلى العالمية التكوين رأس.(إدراجه في stdafx.ح)

#ifdef __GNUC__
//from https://gcc.gnu.org/onlinedocs/gcc/Diagnostic-Pragmas.html
//Instead of put such pragma in code:
//#pragma GCC diagnostic ignored "-Wformat"
//use:
//PRAGMA_GCC(diagnostic ignored "-Wformat")
#define DO_PRAGMA(x) _Pragma (#x)
#define PRAGMA_GCC(x) DO_PRAGMA(GCC #x)

#define PRAGMA_MESSAGE(x) DO_PRAGMA(message #x)
#define PRAGMA_WARNING(x) DO_PRAGMA(warning #x)
#endif //__GNUC__
#ifdef _MSC_VER
/*
#define PRAGMA_OPTIMIZE_OFF __pragma(optimize("", off))
// These two lines are equivalent
#pragma optimize("", off)
PRAGMA_OPTIMIZE_OFF
*/
#define PRAGMA_GCC(x)
// https://support2.microsoft.com/kb/155196?wa=wsignin1.0
#define __STR2__(x) #x
#define __STR1__(x) __STR2__(x)
#define __PRAGMA_LOC__ __FILE__ "("__STR1__(__LINE__)") "
#define PRAGMA_WARNING(x) __pragma(message(__PRAGMA_LOC__ ": warning: " #x))
#define PRAGMA_MESSAGE(x) __pragma(message(__PRAGMA_LOC__ ": message : " #x))

#endif

//#pragma message "message quoted"
//#pragma message message unquoted

//#warning warning unquoted
//#warning "warning quoted"

PRAGMA_MESSAGE(PRAGMA_MESSAGE unquoted)
PRAGMA_MESSAGE("PRAGMA_MESSAGE quoted")

#warning "#pragma warning quoted"

PRAGMA_WARNING(PRAGMA_WARNING unquoted)
PRAGMA_WARNING("PRAGMA_WARNING quoted")

الآن يمكنني استخدام PRAGMA_WARNING(هذه تحتاج إلى أن تكون ثابتة)

للأسف لا يوجد #pragma warning في دول مجلس التعاون الخليجي ، لذلك يحذر غير محدد pragma.

لا شك في أن دول مجلس التعاون الخليجي إضافة #pragma warning" بدلا من إضافة microsoft #warning.

في الواقع معظم المجمعين أن أعرف عن تجاهل غير معروف #pragma توجيهات الإخراج رسالة تحذير - حتى في أسوأ الأحوال, سوف لا يزال الحصول على إنذار.

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