Что на самом деле делают компоновщики с многократно определенными функциями inline?
И в C, и в C ++inline
функции с внешней связью могут, конечно, иметь несколько определений, доступных во время соединения, при условии, что все эти определения (мы надеемся) идентичны. (Я, конечно, имею в виду функции, объявленные сinline
спецификация связи, а не функции, которые на самом деле указывает компилятор или оптимизатор времени ссылки.)
Так что же делают обычные линкерыделать когда они сталкиваются с несколькими определениями функции? Особенно:
Все ли определения включены в окончательный исполняемый файл или разделяемую библиотеку?Все ли вызовы функции связаны с одним и тем же определением?Требуются ли ответы на вышеуказанные вопросы по одному или нескольким стандартам C и C ++ ISO, и если нет, то делают ли большинство распространенных платформ то же самое?Постскриптум Да, я знаю, что C и C ++ - это отдельные языки, но оба они поддерживаютinline
и их выходные данные компилятора обычно могут быть связаны одним и тем же компоновщиком (например, GCCld
), поэтому я считаю, что не может быть никакой разницы между ними в этом аспекте.