nixp.ru v3.0

19 октября 2017,
четверг,
21:23:00 MSK

DevOps с компанией «Флант»
ertyuo написал 10 января 2010 года в 19:46 (782 просмотра) Ведет себя неопределенно; открыл 1 тему в форуме, оставил 1 комментарий на сайте.

Узнав из заметки про define и include, возник вопрос по поводу применения директивы препроцессора define в качестве макроса, т.е. замены функции. Но вот широкого применения в практических примерах я так и не увидел, хотя с ней происходит экономия кода и программы становятся гораздо читабельные. Кто знает, в чем заключается проблемы в использовании макроса define?

myst

1. Что такое «экономия кода"?

2. Такими вещами, как «экономия» чего бы то ни было, должен заниматься компилятор.

3. Как именно ты предлагаешь их применять? Т.е. они применяются ровно настолько, насколько польза от этого превышает неудобства. Приведи пример.

ertyuo

1. Вот экономия на мой взгляд:

Ну вот, например, функция:

int Sum (int a, int b)

{

return a+b;

}

макрос define:

#define Sum(a,b) (a+b)

Т.е. вот данный пример занимает меньше места, что способствует более удобному пониманию кода. В принципе, вот к такой замене функций и вел. Т.е. те, которые делают 1-2 действия, легко заменяемые макросом.

myst

/me потёр руки

1. Вместо sum(a, b) люди пишут a + b. Приведи реальный пример.

2. Не вижу тут экономии — вместо вызова одного и того же участка кода, это будет вставлено повсеместно.

3. А вот если я захочу сделать так:

int apply(int (*f)(int, int), int a, int b)
{
        return f(a, b);
}


сам угадай, что будет.

sendmoreinfo

С — все-таки не ассемблер, в котором функции и вовсе не предусмотрены :-) почитайте несколько монографий по языку (начиная с K&R).

думать за компилятор не надо. если вас беспокоят короткие функции, то знайте, что компилятор может сделать inline тела такой функции — эффект будет такой же, как от самопального макроса, а все радости приведения типов и прочего — останутся.