An Example: Assumption Verification

Подтверждение предположений, используя утверждения является примером обычного использования препроцессора и его особенностей. assertion - утверждение, помещенное в исходный текст, чтобы проверить предположение. Обычно, программисты помещают утверждения в начале определения функции, чтобы проверить предположения, которые они сделали, проектируя функцию. Если во времени выполнения предположение, оказывается неправильным, утверждать assertion показывает сообщение и останавливает выполнение программы. Используемый в этой манере, assertion - превосходный инструмент для обнаружения ошибки.

Рассмотрим функцию calculate_average, который вычисляет среднее число ряда ценностей. Мы предполагаем, что функции передает два параметра целого числа отличных от нуля к функции. В контексте большей программы, если бы второй параметр передали как ноль, ошибка во время выполнения произошла бы в результате того, чтобы делить на ноль. Как мы можем обращаться с этими недействительными данными? Один путь, замеченный в Распечатке 6, вовлекает кодирование защитно, чтобы обнаружить недействительный случай данных.

1: 2: 3: 4: 5: 6: 7: 8: 9: 10: double calculate_average(int total, int count) { // avoid divide by zero error if (count != 0) { return total / count; } else { return 0; }}
Listing 6 Defensive coding

Вышеупомянутая версия calculate_average работает, в котором это предотвращает деление на ноль ошибку. Это не учитывает, что нулевой счет мог подразумевать, что ошибка произошла в другой части программы. Возможно ошибка существует в коде, который читает ценности от пользователя. Или, возможно некоторый другой кодекс ошибочно переписывал ценность счета. Мы действительно не знаем, но использующий эту версию calculate_average не будет помогать нам обнаружить и определить местонахождение этой ошибки.

Следующая версия calculate_average берет другой подход. Здесь, предположение о действительных данных проверено, используя утверждение. Если гость проходов функции недействительные данные (то есть, счет равняется нолю) к функции, утверждение показывает сообщение об ошибке и останавливает выполнение программы. Программист может тогда найти ошибку, которая заставила прохождение недействительных данных функционировать calculate_average.

1: 2: 3: 4: 5: 6: 7: double calculate_average(int total, int count) { // assume we are given valid data assert (count != 0); return total / count;}
Listing 7 Verifying an assumption using an assertion

Утверждать утверждение фактически - макрос. Содержавший в библиотеке <cassert>, это макро-определение - небольшой комплекс, но ценность, исследующая, так как это включает несколько различного использования препроцессора. Следующий пример перечисляет определение утверждения макро-от ГНУ C ++ компилятор.

1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: /* assert.h*/ #ifdef __cplusplusextern "C" {#endif #include "_ansi.h" #undef assert #ifdef NDEBUG /* required by ANSI standard */#define assert(p) ((void)0)#else #ifdef __STDC__#define assert(e) ((e) ? (void)0 : __assert(__FILE__, __LINE__, #e))#else /* PCC */#define assert(e) ((e) ? (void)0 : __assert(__FILE__, __LINE__, "e"))#endif #endif /* NDEBUG */ void _EXFUN(__assert, (const char *, int, const char *)); #ifdef __cplusplus}#endif
Listing 8 The assert macro definition

Заметьте использование условной трансляции в определении утверждения макро-. Включая определение NDEBUG в программу повредил бы все проверки утверждения. Выпуская версии производства программного обеспечения, программисты типично удаляют утверждения.

1.3.5 A Side-By-Side Example We have seen a lot of similarities and differences between C++ and Java. Until this point in the course, C++ and Java are more similar than they are different. In 1.4 Memory Management, we focus on some of the major differences in the languages. Before we delve into those topics, now is probably a good time to look at a full-length Java program and an equivalent C++ version.   1.3.5 A Side-By-Side Example Мы видели много общих черт и различий между C ++ и Явой. До этого пункта в курсе C ++ и Ява более подобны, чем они различны. В 1.4 Memory Management, мы сосредотачиваемся на некоторых из главных различий в языках. Прежде, чем мы будем копаться в тех темах, теперь вероятно хорошее время, чтобы смотреть на Явскую программу во всю длину и эквивалентный C ++ версия.