|
+-----------+-----------+
| |
libc.so (c calls b) libd.so (d calls b)
| |
| |
libb1.a libb2.a
В b{1,2}.cpp я определил две разные версии функции с именем b (с одним и тем же идентификатором).
Я ожидал, что когда функции {c,d в lib{c,d}.so вызывают b, они будут вызывать версию, которая статически связана с собой соответственно.
Однако результат оказался неожиданным: во время выполнения он всегда ведет себя так, как будто существует только одна единственная версия b.
Мой вопрос:
Является ли такое поведение детерминированным?
Независимо от того, сколько существует повторяющихся определений с одним и тем же именем, и независимо от используемого метода связывания (динамического, статического и т. д.), будет ли когда-либо выбрано только одно из них во время выполнения?
Всегда ли компоновщик и загрузчик гарантируют такое поведение?
(Приношу извинения за недостаток знаний относительно этих низкоуровневых деталей.)
Ниже приведен краткий тестовый код:
- headers:
// b.h
#include
std::string b(const std::string& s);
// c.h
#include
std::string c();
// d.h
#include
std::string d(); - источники:
// a.cpp
#include
#include "c.h"
#include "d.h"
int main() {std::cout
Подробнее здесь: https://stackoverflow.com/questions/798 ... -functions
Мобильная версия