Подтвердить что ты не робот

C макросы: преимущество/намерение явно бесполезного макроса

У меня есть некоторый опыт программирования на C, но я бы не стал осмеливаться назвать себя опытным. Недавно я столкнулся с следующим макросом:

#define CONST(x) (x)

Я нахожу, что он обычно используется в выражениях, например, например:

double x, y;
x = CONST(2.0)*y;

Полностью озадаченный точкой этого макроса, я подробно изучил преимущества/недостатки и свойства макросов, но все же я не могу понять, что будет использовать этот конкретный макрос. Я что-то пропустил?

4b9b3361

Ответ 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

Я, кажется, помню, что у нас была потребность в чем-то подобном в предыдущем жизненном цикле разработки.