M>vc7.1
M>первый вариант: M>... M>в бинарнике получаем две переменные sign и две функции foo() (одна заинлайнена)
Не совсем ясно, что означает появление переменной sign в бинарнике, т.к. она не имеет связывания. Если же речь идет о числовом литерале 0xC0DEC0DE, то понятие связывания к нему неприменимо и его представление определяется реализацией, на моей VC 7.1 константа подставляется непосредственно в код каждой из функций foo.
M>второй вариант: M>... M>в бинарнике получаем одну переменную sign и одну функцию foo()
Это странное поведение, в asm-листинге и объектных файлах я получил по 2 независимых экземпляра foo на доступных мне компиляторах, в том числе на VC 7.1, как и ожидалось. В имя foo после декорирования тем или иным образом включается уникальный идентификатор единицы трасляции. Возможно, линкер оказался достаточно умным, чтобы выкинуть дублирующиеся определения, пока в коде нет взятия адреса.
M>получается используя unnamed namespace теперь можно преспокойно define любые функции в *.h instead of *.cpp?
Во всяком случае, это не будет прямым нарушением ODR.