min, max, abs.. are macroses?

The idea is to get them out of the pre-processor and into the compiler. So the basic answer to that question is "anything parsed by the compiler".

A classic implementation is this:

template<typename T>
  const T&
  max(const T& a, const T& b)
  { return (a > b) ? a : b; }

This has the interesting side effect of requiring the types to be identical, which safeguards against accidentally comparing disparate types, which gives the compiler permission to get funky on your types (er, I mean, implicitly convert them on you), which can lead to unpredictable results. If that's overly pedantic, max() can be declared with two types, in which case it will behave more like normal.

Leaving it in the pre-processor means you rob files from defining it another namespace, or even as a method in a class!

Try compiling this:

class wtf
{
  int max(void)
  {
    return 1;
  }
};

void setup(void)
{
  wtf w;
  Serial.print(w.max());
}

You get this helpful error...

sketch_dec26a.cpp:6:15: error: macro "max" requires 2 arguments, but only 1 given
sketch_dec26a.cpp:15:22: error: macro "max" requires 2 arguments, but only 1 given
sketch_dec26a:2: error: function definition does not declare parameters