Идентичность статической встроенной функции?

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

  •  14-11-2019
  •  | 
  •  

Вопрос

Имеет ли статическая встроенная функция C идентичность во время выполнения?

Должен ли я заботиться о конфликте имен этих конструкций?

Если функция определена в .c файл?Это то же самое?

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

Решение

Имеет ли статическая встроенная функция C идентичность во время выполнения?

Статическая встроенная функция имеет идентичность внутри единицы компиляции, если компилятор хотя бы один раз решит не встраивать ее или если вы берете адрес функции.

Взятый адрес действителен только в текущей единице компиляции (.c файл).В другом модуле компиляции (другом .c файл), компилятор предоставит вам другой адрес.

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

Статическая встроенная функция (как и любая статическая функция) не видна ни из какой другой .c файл, чем текущий скомпилированный .c файл.

Должен ли я заботиться о конфликте имен этих конструкций?

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

  1. Статическая встроенная функция f определяется в файле a.h
  2. a.h включен в файлы C x.c и y.c
  3. x.c берет адрес f и сохраняет его в глобальную переменную f_addr
  4. y.c берет адрес f и сравнивает его на предмет идентичности со значением, хранящимся в f_addr
  5. Результатом сравнения будет false, несмотря на то, что на другой уровень абстракции это та самая функция f

Если функция определена в файле .c?Это то же самое?

С точки зрения компилятора C, это то же самое, что определение функции в файле заголовка и включение файла заголовка в файл .c.Компилятор понятия не имеет о файлах заголовков, он видит только одну единицу непрерывной компиляции.Заголовочный файл — это концепция, существующая в сознании программистов, использующих язык C, но с точки зрения компилятора C эта концепция не существует.

Другие советы

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

Во время выполнения имя функции не имеет значения.

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

Возможно, вас не волнуют конфликты имен встроенных функций, но я гарантирую, что компилятор это сделает!

Встраивание — это операция на более позднем этапе компиляции: сначала компилятору необходимо определить структуру вызовов вашей программы, что требует от компилятора правильного разрешения всех именованных вызовов.

Во время выполнения вы не можете узнать имя какой-либо выполняющейся в данный момент функции без явного кодирования какой-то магии для ее определения - c не является отражающий.

Как отмечает Марк, ключевое слово inline — это всего лишь подсказка: компилятор может игнорировать его, если решит, что явный вызов обеспечит лучшую производительность.

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