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