ISO С++ говорит, что встроенное определение функции-члена в С++ такое же, как объявление его с помощью inline. Это означает, что функция будет определена в каждом модуле компиляции, в котором используется функция-член. Однако, если вызов функции не может быть встроен по какой-либо причине, функция должна создаваться "как обычно". (http://msdn.microsoft.com/en-us/library/z8y1yy88%28VS.71%29.aspx) Проблема, с которой я сталкиваюсь с этим определением, заключается в том, что она не говорит о том, в какой единицы перевода она будет создана. Проблема, с которой я столкнулся, заключается в том, что при обращении к двум объектным файлам в одной статической библиотеке, каждая из которых имеет ссылку на некоторую встроенную функцию-член, которая не может быть встроена, компоновщик может "выбрать" произвольный объектный файл в качестве источника для определения. Этот конкретный выбор может ввести ненужные зависимости. (между прочим)
Например: В статической библиотеке
A.h:
class A{
public:
virtual bool foo() { return true; }
};
U1.cpp:
A a1;
U2.cpp:
A a2;
и множество зависимостей
В другом проекте main.cpp:
#include "A.h"
int main(){
A a;
a.foo();
return 0;
}
Второй проект относится к первому. Как узнать, какое определение будет использовать компилятор, и, следовательно, какие объектные файлы со своими зависимостями будут связаны? Есть ли что-нибудь, что стандарт говорит по этому поводу? (Пробовал, но не смог найти это)
Спасибо
Изменить: поскольку я видел, как некоторые люди неправильно понимают, в чем вопрос, я хотел бы подчеркнуть: если компилятор решил создать символ для этой функции (и в этом случае он будет, из-за "виртуальности", в другом объектном файле будет несколько (внешне видимых) экземпляров, какое определение (из какого объектного файла?) выберет компоновщик?)