Лучше использовать typedef. Причина, по которой ваш макрос может потерпеть неудачу, заключается в том, что он может быть синтаксически недействительным в некоторых местах. Рассмотрим:
double x = calc();
ulong v = ulong(x);
В этом случае вы получите
unsigned long v = unsigned long(x);
Это недопустимо, поскольку используемая форма приведения несовместима с тем, как вы называете тип (она должна состоять из более простой формы, например, из одного слова). Используйте typedef:
typedef unsigned long ulong;