Им нужно будет включить файл, содержащий #define PI 3.14, в противном случае препроцессор не будет читать строку #define, и в результате компиляция завершится неудачей.
В C ++ хорошим способом думать о процессе компиляции является то, что каждый отдельный файл C ++ сначала запускается через препроцессор, который принимает все операторы #define, #include и других препроцессоров и заменяет их в коде, а затем скомпилирован (на этом этапе файл C ++ и все, что было введено через #include, обрабатываются почти так, как если бы это был один очень большой отдельный файл), затем после этого компоновщик получает окончательный вывод на этапе предварительной обработки / компиляции для всего C ++ файлы и собирает их в один конечный выходной файл. Препроцессор (который обрабатывает определения) работает до стадии компиляции, а не во время компоновки.