Если я использую некоторые макрокоманды в пространстве имен, то почему они должны работать вне пространства имен? Проверьте этот код, например:Почему определения внутри пространства имен C++ работают вне пространства имен?
#include <bits/stdc++.h>
namespace foo {
#define a x*2
int f(int x) {
return a;
}
}
int main() {
int a = 50;
std::cout << a << endl;
std::cout << foo::f(4) << endl;
return 0;
}
Здесь я никогда не писал, используя пространство имен foo. Но этот код не скомпилируется, потому что при попытке объявить int a он будет нарушен ранее определенным a. Но почему это должно произойти?
re "или любые другие языковые конструкции C++", для использования в качестве условий '# if' препроцессор поддерживает подмножество выражений C. Стоит отметить, что эти выражения не включают в себя литералы 'false' и' true' C++. Тестирование только сейчас для практики, g ++ принимает их, но Visual C++ этого не делает. –
Этот ответ верный, но я хотел бы расширить терминологию. Шаг препроцессора возникает перед разбором и, с технической точки зрения, обрабатывает отдельный язык. IE все директивы, такие как '# include', разворачиваются, а затем результирующий предварительно обработанный источник анализируется и создается AST (абстрактное исходное дерево). Вы можете выгрузить предварительно обработанный вывод, вызвав 'gcc -E'. –
@os_ Это достаточно ясно (и, по крайней мере, принято) ИМХО. Вы можете попробовать изменить, чтобы улучшить. –