Здравствуйте, wander, Вы писали:
W>Ну ладно, хорошо, выводы неправильные, Кодт успешно это доказал. W>Но вопрос-то исходный остался, куда в стандарте смотреть?
Здравствуйте, uzhas, Вы писали:
W>>Студия получается изменяет linkage переменной внутри анонимного namespace. U>откуда такие выводы? я бы дополнительно распечатал адреса переменных вместе со значениями, ибо подозреваю, что просто компиляторы цепляются за разные переменные, то есть для студии a и ::a ссылаются на одну переменную
Именно так. Только это шутки линкера.
namespace
{
int a = 0;
}
int a = 123; // * если перенести определение сюда из строки ***template<int* P> struct foo {};
int main()
{
extern inta; // то компиляторы ругаются на неоднозначность здесьbool e = ((void*)&a == (void*)&::a); // и здесь
foo<&a> f1;
foo<&::a> f2;
f1 = f2; // ** иначе, компиляторы ругаются на несоответствие типов foo<&`anonymous-namespace'::a> и foo<&::a>
std::cout << std::boolalpha << e << std::endl;
return 0;
}
int a = 123; // ***
Но если * и ** закомментировать, то VC (2010, 2012) напишут true, а gcc — false.
#include <iostream>
namespace
{
int a = 0;
}
int main()
{
extern int a;
std::cout << a << std::endl;
std::cout << ::a << std::endl;
return 0;
}
b.cpp
int a = 1;
На GCC 4.7.2 я получаю вывод 1, 0
На VS 2012 получаю 0, 0.
Студия получается изменяет linkage переменной внутри анонимного namespace. Правильно ли это?
Читал стандарт и не нашел явных запретов на это, но и подтверждений такому поведению тоже (может быть что-то упустил).
Спасибо.
Здравствуйте, wander, Вы писали:
W>Студия получается изменяет linkage переменной внутри анонимного namespace.
откуда такие выводы? я бы дополнительно распечатал адреса переменных вместе со значениями, ибо подозреваю, что просто компиляторы цепляются за разные переменные, то есть для студии a и ::a ссылаются на одну переменную
Здравствуйте, Кодт, спасибо — понятно все.
Не подумал я чего-то, в этом случае, в асм лезть. Первым делом грешить начал, что или студия стандарт опять недособлюла, либо я совсем слепой стал и важное что пропустил.
А ссылку со стандарта эту я знаю. И ведь extern int a в области видимости функции должен был скрыть глобальное имя a. Оттого и подумал, что студия linkage у переменной в анонимном неймспейсе поменяла.