При существующем препроцессоре, единица (ключевое слово — она одна!) трансляции формируется методом тупой замены всех директив #include на содержимое включаемого файла. С поправкой на контроль рекурсивных директив #include, отработкой защитных #ifndef _МОЯ_ХЕРНЯ_ИНКЛЮДЕД и прочего #pragma once.
И только после этого единица трансляции передается компилятору. Компилятор располагает информацией о том, где и что определено (хотя бы, для отладочных символов), но это все.
На что мы можем надеяться, так это на то, что разработчик библиотек предусмотрел некую версионность своих творений и документировал границы совместимости. Отсюда всякие ворнинги о том, что такой-то вызов устарел, например, или начиная с такой-то версии есть новый вызов инициализации. Примеров тому масса (см. код ядра с его вечными #if LINUX_VERSION_CODE >= KERNEL_VERSION(x,y,z)).