MTP>Не совсем ясно, что означает появление переменной sign в бинарнике, т.к. она не имеет связывания. Если же речь идет о числовом литерале 0xC0DEC0DE, то понятие связывания к нему неприменимо и его представление определяется реализацией, на моей VC 7.1 константа подставляется непосредственно в код каждой из функций foo.
да, я имел ввиду числовой литерал, я ввел его чтобы сразу было видно в бинарнике сколько тел функций получилось (надо было ещё volatile добавить на всякий случай), но потом на всякий случай отдизасмил бинарники чтобы точно убедиться что там две или одна функции
MTP>Это странное поведение, в asm-листинге и объектных файлах я получил по 2 независимых экземпляра foo на доступных мне компиляторах, в том числе на VC 7.1, как и ожидалось. В имя foo после декорирования тем или иным образом включается уникальный идентификатор единицы трасляции. Возможно, линкер оказался достаточно умным, чтобы выкинуть дублирующиеся определения, пока в коде нет взятия адреса.
vc7.1, вот три варианта моих бинарников
http://rsdn.ru/File/57441/bin.rar (static — 2 тела функции foo(), namespace, inline — 1 тело функции foo())
M>>мне нужно чтобы была только одна копия функции, inline размажет функции в каждый объектник
MTP>C unnamed namespace будет то же самое. Чем не устраивает стандартная практика размещать в заголовочных файлах только объявления функций?
просто сниппеты обычно маленькие и самодостаточные и не хочется разбивать их на utils.h(классы)/utils.cpp(функции) это не удобно, хочется всё держать в одном utils.h
AL>Корректный способ решения, на мой взгляд -- поместить функцию в именованное пространство имен (или в global scope) и объявить ее inline. Современные компиляторы все равно сами решают, встраивать функцию или нет (даже если она и не объявлена inline), а вот проблемы с ODR и статическими переменными внутри функций будут сняты.
and a special thanks goes to a-lex, решение с inline просто великолепно подошло для моих нужд