Возможно, просто глюки, но чтобы уверенно сказать нужно поднимать описание K&R препроцессора. Вообще говоря, под #if должно вычисляться арифметическое выражение. То есть u16 и т. д. должны быть числами, а не типами данных. Про типы данных препроцессор ничего не знает - они появляются после его прохода.