Использование typedef превращает результат в фактический тип, который помещается в дерево синтаксиса. (Другими словами, компиляторы знают об этом и распознают его как часть языка.)
#define
, напротив, это просто текстовая подстановка. Таким образом, компилятор никогда не узнает об этом, он просто видит то, что подставляется. Это может затруднить поиск ошибок компиляции.
В вашем случае я бы, вероятно, порекомендовал typedef. У #define есть место, но я не вижу причин, по которым вы не захотите использовать typedef здесь.
Имейте в виду, что другие библиотеки могут определять эти типы, поэтому у вас могут быть коллизии. Если вы действительно хотите быть кроссплатформенным, вы можете подумать об определении типов с помощью пространства имен вашего приложения. Нравится
myapp_dword
myapp_word
, чтобы минимизировать коллизии с другими библиотеками.
Наконец, я бы порекомендовал против всего подхода, который вы используете. Если это вообще возможно, лучше использовать только имена типов, определенные в языке и в стандартной библиотеке C (например, size_t и т. Д.). Ваш код будет более переносимым, и у вас будет меньше головной боли.