Может ли встроенная функция, определенная в двух отдельных файлах CPP создать дублирующиеся символы во время связывания?

StackOverflow https://stackoverflow.com/questions/19843380

Вопрос

Я нахожу много ресурсов в Интернете о том, как inline (и даже __attribute__((always_inline)) или же __forceinline) не заставляет компилятор (например, GCC или Visualc ++) внедрить функцию. Но когда точно не будет применено? Есть ли игрушечный пример?

Возможно, не обязательно тот же вопрос, когда функция будет отмечена inline Включен в два разных файла CPP создают проблемы во время сцепления? А именно, генерировать дублирующие символы?

Вот бетонная песочница, чтобы попытаться сломать инлин, внедряющий компилятор и генерировать дублированный символ:

В myinline.h:

inline int myinline()
{
  // code that cannot be inlined...
  ...
}

В aux.cpp:

#include "myinline.h"
int aux()
{
  return my_inline();
}

В main.cpp:

#include "myinline.h"
int aux();
int main()
{
  return aux() + my_inline();
}

Тогда, например, в случае GCC есть какой -то (минимальный) код для myinline Это вызовет дублированный символ при компиляции и связывании с:

g++ -o aux.o -c aux.cpp
g++ -o main.o -c main.cpp
g++ -o example aux.o main.o

?

Это было полезно?

Решение

«Инонирование» и «дублирующие символы» - это разные вещи. А inline Ключевые слова явно допускают несколько определений (то есть он освобождает вас от правила однократного определения), поэтому платформа (компилятор и линкер) должна знать, как обрабатывать и дедуплизировать это.

(Это происходит все время для функций членов класса, которые определены в заголовках.)

Если ты просто хочешь генерация кода Чтобы произойти, вы можете где -нибудь сохранить адрес функции:

auto fp = my_inline;

Таким образом, компилятор должен генерировать определение функции, чтобы иметь возможность дать ему адрес. Но даже если вы делаете это в каждом блоке перевода, вы не получите ошибку линкера, так как это будет посвящено во время ссылки. Требование о том, чтобы все определения были идентичны, убедительно, что это четко определен.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top