2013-03-01 12 views
2

Этот вопрос возник во время реализации моей статической библиотеки.
Я хочу, чтобы проверить мои предположения и получить информацию об использовании встроенных функций в статических библиотеках.Статические библиотеки. Импорт и экспорт встроенных функций

  • Моя догадка, что iplementator статического Lib не может экспортировать функцию встроенной в его библиотеке
    Благодаря инлайн оператор реализуется компилятором (это до компилятора ли введите функцию inline), поместив команды нижнего уровня, представляющие операции в тело функции, в сегмент кода, чтобы операции не были помещены в таблицы экспорта/импорта, и поэтому не могут обрабатываться компоновщиком и поэтому не может быть включен библиотекарем в c ода приложения, к которому прикреплен статический lib . Правильно ли моя логика?

  • Я предполагаю, что функция как инлайн импорта допускается, но мне интересно, как это реализовано, потому что это compiler`s ответственности, но о состоянии сцепления есть только библиотекарь, так , что означает, что он должен предпринять некоторые действия, чтобы сделать функцию встроенной.

+0

встроенная функция всегда будет определена в заголовке, поэтому компилятор все равно ее увидит. – 2013-03-01 14:12:09

ответ

5
  1. Да, встроенные функции обычно помещаются в заголовок, поэтому тело функции непосредственно видимо компилятору везде, где используется функция. Это позволяет компилятору оценить, следует ли генерировать встроенный код для функции в любом конкретном экземпляре.

  2. В принципе это не возникает - «Встроенная функция должна быть определена в каждой единицы перевода, в которой она используется в качестве параметра». (§3.2/3). Это означает, что если компилятор будет генерировать функцию inline, то, что входит в библиотеку, является объектный код, который включает встроенное расширение кода для этой функции. Так как возможно, что функция не может быть расширена встроенной при каждом использовании, также обычно будет определение функции в библиотеке, но это определение будет использоваться (по крайней мере в первую очередь), как обычная функция, а не расширенная встроенная.

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

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

1

Вы понимаете ключевое слово inline - вы можете в равной степени использовать замену.

Встроенная функция позволяет скомпилировать, если это позволяет заменить вызов функции фактическим кодом - ничего не экспортировать/импортировать. Он определен в файле заголовка. Все, что использует объектный код, потребует кода заголовка и, следовательно, компилятор заменит вызов функции фактическим кодом.

1

В Visual C++ вы можете использовать специфическое поведение Microsoft и экспортировать/импортировать встроенные функции с помощью __declspec(dllexport) inline или extern inline. Обратите внимание, что это специфическое поведение Microsoft, если вы нацеливаете что-либо, кроме Windows, и не имеете отношения к переносимости, вы можете это рассмотреть.

Смежные вопросы