Для функций, объявленных как подставляемые (с ключевым словом inline), по умолчанию тоже применяется внутренняя компоновка. Функция, определенная в одном модуле, не видна в другом модуле. Даже если определения в модулях абсолютно синтаксически совпадают — это все-таки могут быть разные функции, например:
// модупь А.срр
const int а = 7;
inline void f(void)
{ cout << a << "f()\n"; }
// модупь В.срр
const int a = 10; .
inline void f(void)
{ cout << a << "f ()\n"; }
Любому программисту просто необходим планшет. Если вы не хотите много тратиться на этой покупке, тогда вам необходима http://www.odniskidki.ru/prodgroups/plansheti которую вы найдете тут. Так же при покупке вы можете получить приятные бонусы или попасть на акцию. Не забудьте посмотреть спецпредложения на сайте.
При вызове первой функции в модуле А получим на экране 7f (), а при вызове второй в модуле В на экране появится 10 f ().
Так же как и определение класса, определение подставляемой функции может быть включено в программу несколько раз — по одному определению в каждом модуле. Чтобы гарантированно иметь в разных модулях одно и то же определение, мы вынесем его в отдельный модуль и подключим этот модуль в нужных файлах с помощью директивы #include — компоновщик против не будет. Естественно, определение не должно зависеть от локализованных имен, как в приведенном ранее примере.
Можно сделать подставляемую функцию глобальной — точно так же, как и константу, указав в определении ключевое слово extern:
// модупь А.срр
// Опредепение гпобапьной inline-функции extern inline void f(void) { cout << a << "f()\n"; }
В другом модуле достаточно указать прототип: // модупь В.срр
// объявпение внешней inline-функции void f(void);
К прототипу можно добавить спецификаторы extern и inline: extern inline void f(void);
Как видите, в этом случае можно обойтись без подключения модуля с определением. |