Buonasera, avrei gentilmente bisogno di un vostro aiuto.

Sbirciando dei codici c++ trovati su internet per imparare, mi sono imbattuto in alcuni problemi. Ve li espongo:

1. Qual'è la differenza tra "inline" e "#define"?

Questo è un esempio in cui la medesima funzione restituisce valori diversi a seconda se essa è definita con inline o con #define:

codice:
#define SQUARE(x) ((x)*(x))
int a = 2;
int b = SQUARE(a++);

// Alla fine risulta a = 4, b = 2*3 = 6
codice:
inline int SQUARE(int x)
{
   return x*x;
}
int a = 2;
int b = SQUARE(a++);

// Alla fine risulta a = 2, b = 2*2 = 4
Perché i due codici si comportano in maniera differente? Cosa succede precisamente? Ho sentito che inline serve per ridurre il tempo di overhead... è quindi consigliabile usare SEMPRE inline al posto di define oppure di non utilizzare niente?

2. Ho trovato il seguente codice:

codice:
#ifndef NO_ASSERTD
#undef  assertd
#define assertd(exp) ((void)NULL)
#endif

...

inline char GetAt(int pos) const 
{
   assertd(pos<Len); return pData[pos]; 
}
Quello che mi chiedo è: assertd è una funzione standard del C/C++ che voi sappiate? NULL è una costante predefinita in C++? Si può scrivere NULL in minuscolo? Cosa significa (exp)((void)NULL)?