10. Стиль программирования.
При записи макросов и констант соледует придерживаться следующих правил записи:
1. Выбор имен для констант и макрокоманд
Константой является имя, которое связывается Си-компилятором с неизменяемым в программе значением. Для используемых в программе констант и макрокоманд следует выбирать содержательные имена. Кроме этого, чтобы помочь программисту, читающему исходный код, отличать имена констант от имен переменных, для задания имен констант и макрокоманд рекомендуется использовать прописные буквы. Следующие директивы #define содержат различные определения макрокоманд (макроопределения):
#define TRUE 1
#define FALSE 0
#define PI 3.1415
#define PROGRAMMER "Kris Jamsa"
Константы могут содержать целые числа, числа с плавающей точкой и символьные строки.
2.Хорошим стилем будет использовать дополнительные скобки в сложных макросах. В примере выше переменная "x" всегда окружена своими собственными круглыми скобками. В этом случае выражение будет вычесленно полностью перед сравнением с 0 или умножением на -1. Также, окружая скобками параметры, мы предовращаем загрязнение кода .
Скобки, содержащиеся в макроопределении, позволяют избежать недоразумений, связанных с порядком вычисления операций. Например, при отсутствии скобок выражение t=LENGTH*7 будет преобразовано в выражение t=80+10*7, а не в выражение t=(80+10)*7, как это получается при наличии скобок, и в результате получится 780, а не 630.
3.Идентификатор (макрос) в директиве define принято записывать прописными буквами:
Программисты, пишущие на С, часто используют заглавные буквы для определения идентификаторов. Данное соглашение помогает любому человеку, читающему программу, бросив на нее один взгляд, узнать, что он имеет дело с макросом. Также вce #define лучше помещать в начале файла или вообще в отдельный заголовочный файл.
11.Директива undef
Директива undef используется для отмены действия директивы define, синтаксис которой
#undef идентификатор
В некоторых примерах были использованы константы и макрокоманды, которые либо определены препроцессором, либо определялись в самой программе (или ее заголовочном файле). В зависимости от потребностей программы, может оказаться необходимым, чтобы препроцессор отменил или переопределил одну или более таких констант. Например, по следующей макрокоманде переопределяется макрокоманда _toupper, которая определена в заголовочном файле ctype.h:
#define _toupper(c) ((((с) >= 'а' ) && ( (с) <= 'z' ) ) ? (с) - 'а' + 'А': с)
При компиляции программы многие препроцессоры будут выдавать предупреждающее сообщение, информирующее о переопределении макрокоманды. Для того чтобы избежать вывода предупреждающего сообщения, следует использовать директиву #undef следующим образом:
#undef_toupper
#define_toupper(c) ((((с)>='а')&&((с)<='z')) ? (с) - 'а' + 'А': с)
Директива отменяет действие текущего определения define для указанного идентификатора. Не является ошибкой использование директивы undef для идентификатора, который не был определен директивой define, например:
#undef WIDTH
#undef MAX.
В макроопределениях может встречаться несколько макроопределений с одной и той же замещаемой частью. При этом следует использовать в тексте программы директиву препроцессора
#undef ИмяЗамещаемойЧасти
Эта инструкция прекращает действие препроцессора по замене соответствующего идентификатора.
#define PI 3.14 + 0.00159
float pi1 = PI;
#undef PI
#define PI 3.14159
float pi2 = PI;