Макросы C для более сложных функций - PullRequest
1 голос
/ 06 февраля 2011

Я видел простые примеры макросов, но размышлял о чем-то более сложном, скажем, с операторами if и переназначении данных переменных. Можно ли сделать более сложные выражения вроде этого в макросе? У меня есть функция, которая будет запускаться миллиарды раз, поэтому было бы хорошо, если бы препроцессор просто вставлял туда код, а не передавал переменные туда-сюда.

Скажите, у меня есть следующая функция:

int foo(int a, int b, int c){  
if (a > 2)  
  c = a;  
if (b > 3)  
  c = b;  

return a + b + c;  
}

Как я могу превратить это в макрос?

Ответы [ 4 ]

3 голосов
/ 06 февраля 2011

Обратите внимание, что макросы не совпадают с вызовами функций - макросы фактически заменяют исходный код C, где они используются вместо вызова и возврата - поэтому может быть много неожиданного поведения! Ваш пример может быть преобразован в макрос примерно так:

#define FOO(a,b,c)((a)+(b)+(((b)>3)?(b):((a)>2)?(a):(c)))

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

Вероятно, лучше прислушаться к советам других ответов и использовать альтернативные стратегии, чем сложные макросы.

2 голосов
/ 06 февраля 2011

Легко - не используйте макросы - просто используйте встроенные функции:

__inline int foo(int a, int b, int c)
{  
    if (a > 2)  
        c = a;  
    if (b > 3)  
        c = b;  
    return a + b + c;  
}
1 голос
/ 06 февраля 2011

Если кажется, что это должна быть функция, то сделайте ее функцией.

Технология компиляции со временем стала достаточно хорошей, так что вам не придется беспокоиться о таких вещах.Доверьтесь своему компилятору, и с вами все будет в порядке.

1 голос
/ 06 февраля 2011

Хотя вы можете заменить свою функцию макросом, по всей вероятности, это не повлияет на производительность. Любой разумный компилятор переместит функцию в строку, если он думает, что это поможет.

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