typedef służy do definiowania aliasu czyli dodatkowej nazwy do istniejącego typu. #define tworzy makro które nie ma zielonego pojęcia o systemie typów języka C lub C++. Są to więc dwa oddzielne mechanizmy do innych zastosowań.
Jeśli mimo to oczekujesz odpowiedzi 0/1, to preferuj typedef bo ma związek z systemem typów więc jest z zasady bezpieczniejsze. Dobrze jest jednak mieć świadomość że to jedynie inna nazwa dla istniejącego typu a nie nowy typ.
W języku C++ makr unikaj. Po C++11 jest już coraz mniej powodów by je stosować.C++ ma silny jeśli chodzi o kontrolę typów system szablonów.
W C niestety nie masz wyjścia. Niektóre rozwiązania wymagają makr (a więc i #define) i nie da się tego obejść.