Препроцессор "макро-функция" против указателя на функцию - лучший метод? - PullRequest
6 голосов
/ 15 мая 2010

Недавно я запустил небольшой персональный проект (программа преобразования значений RGB в BGR) в C и понял, что функция, которая преобразует из RGB в BGR, может не только выполнять преобразование, но и инверсию. Очевидно, это означает, что мне не нужны две функции rgb2bgr и bgr2rgb. Однако имеет ли значение, использовать ли я указатель функции вместо макроса? Например:

int rgb2bgr (const int rgb);

/*
 * Should I do this because it allows the compiler to issue
 * appropriate error messages using the proper function name,
 * not to mention possible debugging benefits?
 */
int (*bgr2rgb) (const int bgr) = rgb2bgr;

/*
 * Or should I do this since it is merely a convenience
 * and they're really the same function anyway?
 */
#define bgr2rgb(bgr) (rgb2bgr (bgr))

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

Ответы [ 2 ]

6 голосов
/ 15 мая 2010

Другой возможностью было бы просто заставить вторую функцию вызывать первую и позволить компилятору беспокоиться об ее оптимизации (путем встраивания или генерации хвостового вызова).

5 голосов
/ 15 мая 2010

Я бы использовал макрос. Он более распространен и более идиоматичен и сталкивается с меньшим количеством проблем при пересечении единиц перевода (т. Е. Вам не нужно беспокоиться об объявлении макростатической статики).

Кроме того, используя указатель на функцию, вы предотвращаете встраивание в большинстве компиляторов.

Наконец, с помощью указателя функции клиенты могут сделать это:

int evil(const int bgr) { /* Do something evil */ }

bgr2rgb = evil

Конечно, они, вероятно, этого не хотят, но, возможно, в этой строке может быть переменная с именем, аналогичным bgr2rgb, где требуется только одна опечатка ....

Макрос безопаснее, хотя я бы определил его таким образом - здесь нет необходимости в подобном функции макросе:

#define bgr2rgb rgb2bgr
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...