встроенная функция выбора критериев - PullRequest
1 голос
/ 28 мая 2019

У меня есть следующее:

//a.cpp
inline int f(int x) { return x; }
int g(int x) { return f(x); }

//b.cpp
#include <iostream>
inline int f(int x) { return x + 1; }
extern int g(int);
int main() {
    std::cout << g(2) << f(2) << std::endl;
}

Выход 22 (MSVC и GCC), то есть функция a.cpp f встроена вместо b.cpp единица. Каковы критерии выбора функции f в этом случае?

Ответы [ 2 ]

7 голосов
/ 28 мая 2019

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

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

2 голосов
/ 28 мая 2019

Вы нарушаете ODR ( O ne D efinition R ule) здесь и имеете плохо сформированную программу, диагностика не требуется.

Каждыйвстроенное определение должно быть идентичным.

...