Влияет ли встроенная функция на ее связь? - PullRequest
6 голосов
/ 22 декабря 2011

Если я сделаю функцию встроенной, изменит ли она свою связь на внутреннюю?Например: я использую или вызываю встроенную функцию в двух файлах:

file1.cpp

//function definition
inline void foo() {}

file2.cpp
//function definition
inline void foo() {}

Почему мне нужно определить встроенную функцию в каждом файле, чтобы иметь возможность вызывать ее?Я получаю внутреннюю связь?Что если я использую static inline?

1 Ответ

10 голосов
/ 22 декабря 2011

Если я сделаю функцию встроенной, изменится ли она на внутреннюю?

Нет, если он встроен, это не изменит его связь.

Почему мне нужно определить встроенную функцию в каждом файле, чтобы иметь возможность вызывать ее?

Потому что этого требует язык. C ++ 11 7.1.2 / 4 говорит: «Встроенная функция должна быть определена в каждой единице перевода, в которой она используется odr, и должна иметь точно одно и то же определение в каждом случае. "

У меня внутренняя связь?

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

Что если я использую static inline?

Это даст внутреннюю связь из-за static. Это означает, что определения в отдельных единицах перевода будут создавать отдельные функции с разными адресами и разными копиями любых статических объектов.

...