Впервые я об этом услышал.
Нет; #define
и так далее. Иногда используется слишком широко, но определенно используется. Есть места, где стандарт C требует использования макросов - этого легко избежать. Например, в §7.5 Ошибки <errno.h>
говорится:
Макросы
EDOM
EILSEQ
ERANGE
которые расширяются до целочисленных константных выражений с типом int
, отличными положительными значениями и которые подходят для использования в директивах предварительной обработки #if
; …
Учитывая это, ясно, что не все отраслевые стандарты запрещают использование макросов препроцессора C. Однако существуют стандарты «передовой практики» или «руководящие принципы кодирования» от различных организаций, которые предписывают ограничения на использование препроцессора C, хотя ни один из них не запрещает его использование полностью - это врожденная часть C, и ее нельзя полностью избежать. Часто эти стандарты предназначены для людей, работающих в критических для безопасности областях.
Один из стандартов, который вы можете проверить - это стандарт MISRA C (2012); это имеет тенденцию запрещать вещи, но даже это признает, что #define
и др. иногда необходимы (раздел 8.20, правила с 20.1 по 20.14 относятся к препроцессору C).
Стандарты кодирования C НАСА GSFC (Центр космических полетов Годдарда) просто говорят:
Макросы следует использовать только при необходимости. Чрезмерное использование макросов может затруднить чтение и поддержку кода, поскольку код больше не читает и не ведет себя как стандартный C.
Обсуждение после этого вступительного заявления иллюстрирует допустимое использование макросов функций.
В CERT Coding Standard есть ряд рекомендаций по использованию препроцессора и подразумевает, что вы должны минимизировать использование препроцессора, но не запрещает его использование.
Страуструп хотел бы, чтобы препроцессор не использовался в C ++, но этого еще не произошло. Как Питер примечания, некоторые стандарты C ++, такие как Стандарты кодирования JSF AV C ++ (Joint Strike Fighter, Air Vehicle) примерно с 2005 г. предписывают минимальное использование препроцессора C. По сути, правила JSF AV C ++ ограничивают его #include
и танец #ifndef XYZ_H
/ #define XYZ_H
/… / #endif
, который предотвращает многократное включение одного заголовка. В C ++ есть некоторые параметры, которые недоступны в C - в частности, лучшая поддержка типизированных констант, которые затем можно использовать в тех местах, где C не позволяет их использовать. См. Также static const
vs #define
vs enum
, где обсуждаются проблемы.
Рекомендуется свести к минимуму использование препроцессора - им часто злоупотребляют, по крайней мере, настолько, насколько он используется (см. Boost препроцессор 'библиотека' для иллюстраций того, как далеко вы можете зайти с препроцессором C).
Резюме
Препроцессор является неотъемлемой частью C и #define
, #if
и т. Д. Нельзя полностью избежать. Утверждение профессора в вопросе в целом неверно: #define
запрещен отраслевыми стандартами вместе с #if
, #ifdef
, #else
и некоторыми другими макросами в лучшем случае является преувеличением, но может быть поддерживаемым с явной ссылкой на определенные отраслевые стандарты (но рассматриваемые стандарты не включают ISO / IEC 9899: 2011 - стандарт C).
Обратите внимание, что Дэвид Хаммен имеет предоставила информацию об одном конкретном стандарте кодирования C - Стандарт кодирования C JPL - который запрещает многие вещи, которые многие люди используют в C, включая ограничение использования препроцессора C (и ограничение использования распределения динамической памяти и запрет рекурсии - прочтите его, чтобы узнать, почему, и решить, являются ли эти причины имеют отношение к вам).
person
Jonathan Leffler
schedule
28.12.2015
#define
и так далее. Иногда используется слишком широко, но определенно используется. Есть места, где стандарт C требует использования макросов - этого легко избежать. Вы можете проверить стандарты MISRA C; они склонны запрещать вещи, но я почти уверен, что даже они признают, что#define
и др. иногда необходимы. - person Jonathan Leffler   schedule 28.12.2015