Правильно ли определять макросы для использования в одной функции

Я не спрашиваю, возможно ли #define макрос внутри функции. Я понимаю, что это возможно, и что макросы — это механизмы предварительной обработки, которые почти копипасты (в некоторой степени). Я спрашиваю, есть ли серьезные причины избегать создания макроса для использования в одной функции, или это просто зависит от сопровождающих кодовой базы в отношении того, что они считают хорошим стилем?

Вот надуманный пример, похожий на мой вариант использования:

int main() {
   /* ... */
   
   #define POS(x, y) grid_array[width*(y) + (x)]
   
   /* Use POS(x, y) in this function */
   
   #undef POS
   
   /* ... */
}

Другой способ задать вопрос: Кивнут ли другие разработчики C в знак понимания или отрицательно покачат головой?

Редактировать:

Это не дубликат вопроса «Макрос против функции». Я понимаю (некоторые) различия между ними, например. MIN(a, b) (a)>(b)?(b):(a) оценивает a и b дважды. Я спрашиваю, хорошо ли использовать макрос для одной функции.

В ответе (и комментариях) указано, что мой простой пример не заслуживает использования макроса. Хотя мой реальный вариант использования не так прост, я должен согласиться. «Сохраненный ввод» не заслуживает запутанного кода.

Вот мой реальный вариант использования, если вам интересно:

/* array represents a graph with max degree 2. These operations are domain specific. */
#define CONNECT(a, b, i) {array[8*(a) + i] = b; array[8*(b) + (i+4)%8] = a;}

Я считаю, что для такого простого примера код становится менее читаемым.

Retired Ninja 24.12.2020 08:26

Несколько связанный поток C++ (не относится к C, потому что C не поддерживает constexpr): Constexpr против макросов

Andreas Wenzel 24.12.2020 08:37

@AndreasWenzel, но более современные и эффективные языки имеют для этого гораздо лучшие конструкции. C++ — это запутанный беспорядок из наполовину продуманных концепций, наполовину хорошо реализованных. Единственное, чему можно у него научиться, так это тому, чего не следует делать. ИМХО.

mevets 24.12.2020 09:00

Отвечает ли это на ваш вопрос? Макро и функция в C

Ulrich Eckhardt 24.12.2020 13:30

Не совсем @UlrichEckhardt. Я понимаю (по крайней мере, большинство) различий между макросами и функциями. Я спрашиваю, разумно ли определять макрос, который используется только в одной функции. Спасибо хоть :)

Noah May 24.12.2020 15:13

Gcc поддерживает вложенные функции в C. Это может быть удобной альтернативой для POS-подобных макросов.

tstanisl 25.12.2020 22:01
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
6
81
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Основная цель любого языка программирования, помимо шестнадцатеричных значений, состоит в том, чтобы сделать намерение и реализацию более очевидными для читателя. Программы предназначены для чтения людьми и перевода машинами.

В этом смысле, если POS(x,y) просто избавит вас от необходимости печатать, это может быть полезно для читателя, но вы должны думать о читателе больше, чем о писателе. Любая стоящая программа будет иметь намного больше читателей, чем авторов, поэтому ваша обязанность как писателя состоит в том, чтобы уменьшить их нагрузку.

«это может быть полезно для читателя» — я думаю, вы имеете в виду «писатель», а не «читатель».

Andreas Wenzel 24.12.2020 08:34

Нет, сокращения помогают писателю сократить количество нажатий клавиш, но могут помочь читателю, снизив когнитивную нагрузку. Вот почему такие обозначения, как ++ или +=, важны; они уменьшают когнитивную нагрузку при чтении программы, особенно в современном контексте чрезмерного указания назначения каждой переменной. Это напряжение между письмом для новичка, который предположительно не понимает языка, и беглым, которого раздражает многословие.

mevets 24.12.2020 08:48

Я могу следовать обоим рассуждениям, Андреасу и Мевецу. Но ответ, вероятно, принесет пользу, если вы (mevets) сформулируете, чтобы уменьшить когнитивную нагрузку для пользователей StackOverflow, чтобы оценить обе интерпретации. (Не высмеивая вас, я намеренно использую ваше выражение, потому что я действительно согласен с концепцией и с тем, как вы ее изложили.) Но у вас уже есть мой голос (за то, что я не сказал ни да, ни нет, что я принимаю как ответ на то, что я сначала рассматривался как вопрос, основанный на мнении), поэтому я боюсь, что вы не получите от меня еще один вопрос, даже если вы сделаете то, что я предлагаю. ;-)

Yunnosch 24.12.2020 15:43

Другие вопросы по теме