кода функции вызывать ее по адресу, то размер памяти для кода, который нужно оставить, известен на этапе компиляции. поэтому можно и определять non-inline функции в разных областях видимости. И компоновщик потом сам подставит нужный адрес.
А если функцию нужно не вызвать, а подставить ее код, но сам код функции находится в другом месте, то что делать компилятору? А линковщик не занимается подстановкой кода, только адресов. В итоге кода нет, его размер не известен, вот компилятор и не сможет подставить код функции в место вызова. А если все делать в .h файлах, то в каждой единице трансляции будет определение inline функции
еще можно добавить, что можно самому задавать свое определение в каждой единице трансляции, но это UB. Компилятор возьмет первое попавшееся или то, которое ему удобно
Обсуждают сегодня