C макросы: преимущество/намерение явно бесполезного макроса
У меня есть некоторый опыт программирования на C, но я бы не стал осмеливаться назвать себя опытным.
Недавно я столкнулся с следующим макросом:
#define CONST(x) (x)
Я нахожу, что он обычно используется в выражениях, например, например:
double x, y;
x = CONST(2.0)*y;
Полностью озадаченный точкой этого макроса, я подробно изучил преимущества/недостатки и свойства макросов, но все же я не могу понять, что будет использовать этот конкретный макрос. Я что-то пропустил?
Ответы
Ответ 1
Как указано в вопросе, вы правы, что макрос ничего не делает.
Это похоже на какую-то искусственную структуру, навязанную тем, кто написал этот код, возможно, чтобы он был совершенно ясен там, где существуют константы, и сможет их искать? Я мог видеть преимущество в поиске констант, но это не лучший способ достичь этой цели.
Также возможно, что это было частью какой-либо другой макро-схемы, которая либо никогда не была реализована, либо была частично удалена.
Ответ 2
Некоторые (старые) компиляторы C не поддерживают ключевое слово const
, и этот макрос, скорее всего, является воспоминанием о более сложной последовательности макросов, обрабатывающих разные компиляторы. Используется как в x = CONST(2.0)*y;
, но не имеет смысла.
Вы можете проверить этот раздел из документации Autoconf для более подробной информации.
EDIT: Другой целью этого макроса может быть пользовательская предварительная обработка (например, для извлечения и/или замены некоторых констант), таких как Qt Framework Компилятор метаобъектов делает.
Ответ 3
Нет абсолютно никакой выгоды от этого макроса, и тот, кто его написал, должен быть смущен. Код полностью эквивалентен x = 2.0*y;
.
Ответ 4
Ну этот макрос действительно может быть полезен, когда есть необходимость обхода макрообмена.
Типичным примером такой необходимости является макрос стробирования. Обратитесь к следующему вопросу для примера: C Препроцессор, строгайте результат макроса
Теперь, в вашем конкретном случае, я не вижу преимущества приложения из экстремальных документов или синтаксического анализа кода.
Ответ 5
Другое использование может заключаться в том, чтобы зарезервировать эти значения в качестве будущих вызовов функций, примерно так:
/* #define CONST(x) (x) */
#define CONST(x) some_function(x)
// ...
double x, y;
x = CONST(2.0)*y; // x = some_function(2.0)*y;
Ответ 6
Еще одна хорошая вещь об этом макросе будет что-то вроде этого
result=CONST(number+number)*2;
или что-то, что связано с сравнениями
result=CONST(number>0)*2;
Если есть проблема с этим макросом, это, вероятно, имя. Эта вещь "CONST" не связана с константами, а с другой. Было бы неплохо найти остальную часть кода, чтобы узнать, почему автор назвал его CONST.
Ответ 7
Этот макрос имеет эффект округления скобок вокруг x во время расширения макроса.
Я предполагаю, что кто-то пытается что-то разрешить по строкам
CONST(3+2)*y
который без парнеров стал бы
3+2*y
но с парнесом становится
(3+2)*y
Я, кажется, помню, что у нас была потребность в чем-то подобном в предыдущем жизненном цикле разработки.