Нет, директивы препроцессора не ограничены никакими областями видимости. Они заменяют абсолютно все вхождения соответствующего имени после своего определения. Пример:
namespace what {
#define apples 2
}
namespace stuff {
class foo {
private:
int apples = 3; // ОШИБКА: 2 - недопустимое имя
public:
int read_apples() {
return apples; // 2
}
};
}
Мораль: не используйте макросы там, где можно обойтись
constexpr
константами или
inline
функциями. А там, где они необходимы, давайте им длинные страшные КРИЧАЩИЕ_ИМЕНА.