sysctl.h seems to use u_int which is defined in sys/types.h. For this reason sysctl.h should probably include sys/types.h. Is there a reason this isn't done?
Historically, BSD has not included in headers all other headers that could possibly be necessary. One reason is to avoid namespace pollution. POSIX prescribes that its headers may be included by themselves, but <sys/sysctl.h> is not specified by POSIX.