Ваши охранники должны отличаться, если некоторый код (прямо или косвенно) должен видеть и A :: CAFile, и B :: CAfile.
Включенные охранники обрабатываются препроцессором, который не имеетзнание во всех классах (не говоря уже о пространствах имен).Если оба этих файла включены при обработке файла c ++ и имеют одинаковые средства защиты заголовков, в предварительно обработанном источнике, который будет видеть компилятор, останется только одно из объявлений.
Посмотрите на такие вещи, как файлы Boost,у них есть некоторые соглашения для охранников заголовка (если я правильно помню).