Встроенные функции с внутренней связью?

В C: Почему так, что только встроенные функции с внутренней связью (т. Е. Объявленные с использованием static) могут ссылаться (например, адрес копирования, чтение, запись или вызов) на переменную или функцию в области видимости файла со статической продолжительностью хранения, в то время как другие встроенные функции не могут?

2 ответа

Решение

Это как вещи определены.

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

Если встроенная функция используется только в этом модуле (внутренняя связь). Тогда можно безопасно предоставить ему доступ к "частным" материалам этого модуля.

Объект или функция с областью действия файла, объявленной со спецификатором хранения "static", имеет внутреннюю связь. В то время как его время жизни - полное выполнение программы, объект с внутренней связью не объявляется (то есть не виден из) других единиц перевода.

Для встроенной функции с внешней связью компилятор может:

  • вызовите экземпляр внутри модуля перевода, в котором объявлена ​​функция
  • выполнить внутреннюю замену в точке вызова
  • создать идентичный, но отдельный экземпляр функции в вызывающей единице перевода

В последних двух случаях объекты с внутренней связью не будут видны. Поэтому встроенная функция с внешней связью не может ссылаться на идентификатор с внутренней связью.

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

Другие вопросы по тегам