سؤال

ويمكنني استخدام وحدات الماكرو لرمز حلقات بسطه مثل هذا: (مثال سخيف)

#define foreach_small_prime(p, instr) {   \
  int p;                                  \
  p = 2; instr;                           \
  p = 3; instr;                           \
  p = 5; instr;                           \
  p = 7; instr;                           \
}

foreach_small_prime(pp, cout << pp);

int sum = 0;
foreach_small_prime(pp, {
  sum += pp;
  if (sum >= 10) cout << sum << endl;
});

ولكن في بعض الحالات I قد تستخدم للبناء:

#define foreach_small_even(ii) for(int ii = 0; ii < 20; ii += 2)

int sum = 0;
foreach_small_even(pp) {
  sum += pp;
  if (sum >= 10) cout << sum << endl;
}

وأنا أحب هذا وحدات الماكرو لأنني لا يمكن تمرير متغير <م> الاسم كمعلمة.

والسؤال: هل هناك طريقة لتحديد حلقة مثل أول واحد في بناء جملة مثل مثل الماكرو الثاني

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

المحلول

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

نصائح أخرى

هل لديك سبب وجيه لتجنب استخدام كائن مكرر؟ عليك أن تنظر الأولى المعاجين الماكرو 4X كود instr بك ...

وعلى خلاف ذلك، بسيط:

#define foreach_smallprime(ii) for(int ii = 0; ii <= 7; ii = next_prime(ii) )

ومع next_prime(ii) المحددة في نفس الملف كما الماكرو.

<اقتباس فقرة>   

والسؤال: هل هناك طريقة لتحديد حلقة مثل أول واحد في بناء جملة مثل مثل الماكرو الثاني

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

const int small_primes[MAX_SMALL_PRIMES] = {2, 3, 5, 7, 11, 13};

#define foreach_small_prime(pp) \
  for (int i = 0; i < MAX_SMALL_PRIMES; pp = small_primes[++i])

والمستخدمة على النحو التالي:

void f() {
  int sum = 0;
  int temp = 0;
  foreach_small_prime(temp) {
    sum += temp;
    if (sum >= 10) cout << sum << endl;
  }
}

وربما تريد أن إرم جدول البحث وMAX_SMALL_PRIMES theirown مساحة لتجنب الفوضى ... وباستخدام المعرف شائعة الاستخدام 'ط' في الماكرو من المحتمل ان يكون سوء اختيار. أنا متأكد من أن هناك طرق أخرى لتحسين ذلك، ولكن هذا هو في الأساس ما كنت طالبا.

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