Usuellement les langages de programmations proposent plusieurs formes de passages de paramètres.
#define max(A,B) (A)>(B)?(A):(B) max(a+b,c) ; // (a+b)>(c)?(a+b):(c)
On peut définir, comme en Ada, un mode in pour lequel les paramètres ne pourront qu'être lus (ce qui suppose un contrôle sur les pointeurs), un mode out dans lequel un paramètre ne pourra qu'être écrit, et un mode in out où le paramètre pourra être lu et modifié. Pour ces différents modes de passage, c'est le compilateur qui garantira que ces propriétés sont vérifiées. Un mode de transmission par référence qui évite la recopie peut être une bonne solution pour ces trois modes.