سؤال

أحاول تجميع lightzpng. مع تحذيرات على المستوى 4. أحصل على الكثير من C4127 للخطوط التي لا تستحق هذا التحذير بوضوح. مثال:

#define MAX_BITS 15
int values_per_bitlen[ MAX_BITS + 1 ];
for ( int i = 0; i <= MAX_BITS; ++i )    // C4127 is here
    values_per_bitlen[ i ] = 0;

كيف يمكن تغيير هذا الرمز لتجنب التحذير غير #PRAGMA؟

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

المحلول

هناك قطعة من التعليمات البرمجية في الجزء العلوي من lightz.cpp الذي يذهب مثل هذا:

#define for if (false) {} else for

هذا يعني أن البيان الفعلي الخاص بك هو:

#define for if (false) {} else for ( int i = 0; i <= MAX_BITS; ++i )

وهذا هو السبب في أنك تحصل على خطأ في التعبير المستمر (إنه false, ، وليس i <= MAX_BITS كما اعتقدت).

ما عليك سوى التعليق أو حذف هذا الخط من الملف (لا يمكنني في الواقع معرفة سبب قيامهم بذلك).

نصائح أخرى

نعم، هذا غريب. انها حقا ليس تعبير دائم منذ i التغييرات في الحلقة. لذلك سيكون هذا مشكلة مع VS2005. لما يستحق، VS2008 يفعل نفس الشيء بالضبط.

الغريب بما فيه الكفاية، مشروع مع مجرد هذا لا يشكو لذلك قد يكون هناك مشكلة حالة حافة غريبة مع رمز جيل تحذير Microsoft:

#define MAX_BITS 15
int values_per_bitlen[ MAX_BITS + 1 ];
int main(int argc, char* argv[]) {
    for ( int i = 0; i <= MAX_BITS; ++i )
        values_per_bitlen[ i ] = 0;
    return 0;
}

ومع ذلك، لم تسأل في الواقع سؤال. ما الذي تريد أن تعرفه، أو تريدنا القيام به؟

تحديث:

راجع إجابة "Windows Programmer" للسبب الفعلي - هناك "#define for if (false) {} else for" في الجزء العلوي من lightz.cpp الذي يسبب المشكلة.

لقد اختبرته على VS2005 الخاص بي ولا يبدو التحذير، حتى في مستوى التحذير 4..

إجراء بسيط بالنسبة لك لمتابعة:

- إبداع تطبيق وحدة التحكم الجديدة ووضع الرمز أعلاه فقط ومعرفة ما إذا كان التحذير يظهر مرة أخرى.

- لا، تحقق من الاختلافات في إعدادات المشروع.

-إذا نعم، أود أن أفترض أن إعداد تحسين الخاص بك قد يسبب ذلك.

وفقا لتشارلز نيكولسون, ، Visual Studio 2005 يعطي هذا الخطأ مع "do...while(0)" حيلة:

#define MULTI_LINE_MACRO \
    do { \
        doSomething(); \
        doSomethingElse(); \
    } while(0)

إذا كنت بحاجة تماما، يمكنك استخدام __pragma. التوجيه لتعطيل التحذير بشكل انتقائي حول جزء رمز معين.

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