سؤال

أريد التحقق من الأمر عدة مرات، أستخدم #define لهذا الإعلان وأريد استخدامه ولكنه لا يعمل

#define CHECK_CONDITION(QString condition, start, curr) if(condition == "" ) return true; return (table.commonIn() == "team_id"? list()[start]->team() ==list()[curr]->team() :list()[start]->team() ==list()[curr]->team())

وأنا استخدمه مثل هذا:

if(CHECK_CONDITION(table.commonIn().toStdString(), start, start-idx);) {
   findFalse = true;
}

كيف يمكنني استخدام هذا التعريف في الكود/ شكرا لك مقدمًا

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

المحلول

يمكنك استخدام ماكرو تعديل هذا:

giveacodicetagpre.

الخطأ الذي قمت به في هذا الماكرو:

  • تحديد qstring للحالة

  • العودة لأن هذا لن يكون له منطق "قيمة إرجاع الماكرو"، ولكن سيعود في الواقع في الوظيفة الخارجية. هذا لأنه يجب أن يذهب من خلال خطوة ما قبل المسامع.

  • لا تحتاج إلى فروع منفصلة داخل الماكرو كمنطقية بسيطة أو ("||") القيام بذلك.

  • استخدمت الجدول الشائع في سلسلة Getter داخل الماكرو على الرغم من أنك مررت بالفعل بمتغير الحالة.

  • أود استخدام الخط الخلفي لجعله ينقسم إلى قطع لقرطيته بشكل أفضل.

ثم يمكنك الحفاظ على بقية رمزك مثل هذا:

giveacodicetagpre.

الأخطاء هنا قمت بها:

  • كان لديك فاصلة منقوطة لا داعي لها داخل حالة ما إذا كانت بناء جملة C ++ غير صالحة.

  • يمكنك الدخول إلى مشاكل بشكل عام (وليس هنا) مع عدم وضع الطرح في قوس.

  • سيكون منظفا إذا كنت تستطيع إنشاء متغيرين منفصلين للسلسلة العدد الصحيحة الحالية قبل مكالمة ماكرو Check_Condition كما أظهر أدناه.

  • أنت تمر STD :: سلسلة بدلا من qString.

ولكن سيكون أكثر أجمل إذا كنت تستطيع ببساطة الجزء الثاني مثل هذا:

giveacodicetagpre.

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

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

نصائح أخرى

لا يحتوي المعالج المسبق على مفاهيم عن الأنواع، لذا عندما تعلن عن ملف #define مع الأنواع، لا تحتاج إلى تحديد نوع المعلمة:

#define CHECK_CONDITION(condition, start, curr) { if(condition == "" ) return true; return (table.commonIn() == "team_id"? list()[start]->team() ==list()[curr]->team() :list()[start]->team() ==list()[curr]->team())}

الى جانب ذلك، أ #define يتم توسيعه حيث تستخدمه (المعالج المسبق يستبدل CHECK_CONDITION مع مجموعة التعليمات البرمجية هذه)، لذلك لن يتم تجميع التعليمات البرمجية الخاصة بك لسبب واحد على الأقل:سوف تقوم بالتعشيش if داخل if الشرط، وهو خطأ في بناء الجملة.

استخدم دالة (ربما مضمنة)، بدلاً من ذلك:

inline
bool check_condition(QString condition, int start, int curr) {
    if(condition == "" ) return true;
    return (
        table.commonIn() == "team_id"?
            list()[start]->team() == list()[curr]->team():
            list()[start]->team() == list()[curr]->team()
    )
}

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

سنتي 2:يجب أن تشاهد المعالج المسبق في C++ كحل أخير:لديك قوالب ومتغيرات ثابتة ووظائف مضمنة.

السبب الرئيسي وراء تركه في C++ (بدلاً من استخدام include الكلمة الرئيسية وحدها أو ما شابه) هي الحفاظ على التوافق مع الإصدارات السابقة مع لغة C.لا تستخدم المعالج المسبق مطلقًا، ما لم يكن أي حل آخر معقدًا إلى حد ما.

أ #define في C/C++ هو تعريف ماكرو يمثل بديلاً نصيًا بسيطًا.يشبه هذا التعريف وظيفة ويحاول تعيين نوع لأحد المعلمات.هذا ليس بناء جملة قانوني وبالتالي QString يجب إزالة الجزء

بشكل عام، على الرغم من أن هذا الرمز ليس مناسبًا بشكل مثالي للماكرو.الحجج start و curr كلاهما يستخدم عدة مرات في التوسيع.وهذا يعني أنه إذا تم تمرير تعبير ذو تأثير جانبي إلى الماكرو، فمن المحتمل أن يتم تنفيذه عدة مرات.ستكون الوظيفة أكثر ملاءمة هنا

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