| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Препроцессор. Или inline ф-ция как макрос. |
| Автор: andrew_121 8.6.2008, 14:06 | ||||
| День добрый. Нужно стандартные ф-ции, типа:
Реализовать в виде макроса. Сама реализация понятна, но как вернуть значение ?
Что вернет return ? |
| Автор: Daevaorn 8.6.2008, 14:12 |
return вернет res. Только этого не будет ожидать клиентский код . Поэтому, во все макросы надо добавить ещё один параметр, куда записывать результат. |
| Автор: andrew_121 8.6.2008, 14:15 |
| Daevaorn: Примерчик можно... Есть еще мнения? |
| Автор: baldina 8.6.2008, 14:29 | ||
| макрос должен представлять выражение, имеющее значение. естественно, никаких return как-то так:
|
| Автор: andrew_121 8.6.2008, 14:31 |
| mes: Что получиться я заню, от этого и вопрос - Как из тела функции в виде макроса, получить результат ??? Добавлено через 4 минуты и 40 секунд baldina: Спасибо. Щас буду тестить. По идее такая реализация строковых функций должна работать быстрее стандартной. А какие подводные камни появятся...? |
| Автор: baldina 8.6.2008, 14:39 | ||
| про выражение написал, а значения не показал не получится тут "вернуть", нужен параметр макроса для результата Добавлено через 4 минуты и 45 секунд
отнюдь. стандартная на ассемблере написана если надо избежать накладные расходы на вызов функции, используй inline кстати, современные компиляторы умеют в режиме оптимизации встраивать такие функции как strcmp, strcpy, pow, sqrt, sin и т.п. (intrinsic functions) |
| Автор: andrew_121 8.6.2008, 14:58 | ||
Знаю про это. Но практика показывает, что это не всегда происходит. И не понятно от чего и почему... |
| Автор: Lazin 8.6.2008, 14:59 |
макросы для этих целей использовать нельзя, это дурной тон. Как уже было сказано, компилятор в состоянии сам определить, где требуется функцию вызвать а где ее лучше встроить. В случае использования макросов таким вот образом, страдает ясность кода, большинство IDE не смогут сделать подсказку для макроса, статические анализаторы кода то-же отдыхают. К тому-же, возможны тяжело обнаруживаемые ошибки. |
| Автор: mes 8.6.2008, 15:02 | ||
не использовать слово return, например #define test(dst, src) ( !src || !*src || !dst ) ? src : dst но в любом случае не понятна цель - если для скорости - то такой путь заблуждение |
| Автор: Lazin 8.6.2008, 15:03 | ||
это происходит, для того, что-бы уменьшить объем кода. там где это может дать увеличение производительности, например в цикле, встраивание происходит. если функция вызывается всего один раз, то экономить пару наносекунд тратящихся на ее вызов нет смысла |
| Автор: andrew_121 8.6.2008, 15:18 | ||||
| mes: Да, для скорости... Так как большие изменения в программу вносить не хочется. Это один из простых способов. Добавлено @ 15:24 Вот что я сделал:
Гну препроцессор сотворяет вот что:
Но почему-то res = 84, а не 0. Первый недостаток макросов - хрен отладишь!!! А...вот опечатка: while (*s1 && (res=*s2++-*s1++)==0); |
| Автор: MAKCim 8.6.2008, 15:31 | ||||
в GCC решение такое
в коде ядра Linux данное расширение широко используется |
| Автор: andrew_121 8.6.2008, 15:38 | ||||
MAKCim Т.е. запись вида:
Будет трактоваться как:
В зависимости от результата...? |
| Автор: MAKCim 8.6.2008, 15:39 |
да, только, наверное, макрос должен называться strcpy, а не strcmp |
| Автор: andrew_121 8.6.2008, 15:42 | ||
| Всем Благодарен. В особености baldina и MAKCim. Добавлено через 2 минуты и 28 секунд
Пардон...я заметил позже... Но не стал изменять название функции. P.S. Ты единственный кто заметил |
| Автор: andrew_121 8.6.2008, 15:59 |
| Хотя...это гибрид какой-то... Суть не в этом. |
| Автор: UnrealMan 8.6.2008, 16:48 | ||
Жесть |
| Автор: MAKCim 8.6.2008, 16:57 |
а то |