Встроенная функция выбора критериев

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

//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 встроена fb.cpp функция. По каким критериям выбирать функцию f в этом случае?

Вы имеете в виду, что вы скомпилировали и связали как a.cpp, так и b.cpp?

François Andrieux 28.05.2019 21:04

да. Вот так!

João Paulo 28.05.2019 21:05

Это кажется актуальным: Одно правило определения

Jesper Juhl 28.05.2019 21:05

Вы включили оптимизацию? Я подозреваю, что вы можете получить другой ответ для сборки без оптимизации/отладки (без встраивания) и для оптимизированной/релизной сборки (с встраиванием).

1201ProgramAlarm 28.05.2019 21:52
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
4
103
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

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

Возможно, расширение того, что означает ODR, поможет завершить этот ответ.

François Andrieux 28.05.2019 21:06
Ответ принят как подходящий

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

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

Может быть, дать ссылку на en.cppreference.com/w/cpp/язык/определение для получения дополнительной информации или объяснить ODR более подробно?

Jesper Juhl 28.05.2019 21:09
«Для встроенной функции [...] требуется определение в каждой единице перевода, где она используется odr». Ничего не говорит о другом определении. Могу ли я сказать, что то, что я представил, является неопределенным поведением?
João Paulo 28.05.2019 21:11

@joãopauli нет, это UB. См. элемент списка 1 здесь: en.cppreference.com/w/cpp/language/inline

NathanOliver 28.05.2019 21:15

@jo - Нет. Должно быть точно такое же определение.

StoryTeller - Unslander Monica 28.05.2019 21:15

О, классно! Понятно!

João Paulo 28.05.2019 21:17

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