Consider the following C++-code with an inline-function:
// this function is in a header-file:
// recursion prevents inlining
inline int calc(int k){
    if(k<=1) return 1;
    return calc(k-1)+calc(k-2);
}
// this function is in a source-file:
int fun(int k){
    return calc(k);
}
Here I use recursion, to simulate the case when compiler was not able to inline the function calc.
The resulting assembly (compiled with -Os, see live on https://godbolt.org/):
...
        .weak   calc(int)
        .type   calc(int), @function
calc(int):
    // some assembler
       .text
        .globl  fun(int)
        .type   fun(int), @function
fun(int):
...
        jmp     calc(int)
As expected, the compiler was not able to inline calc, and thus emitted code for it, but due to inline-keyword it becomes a weak symbol.
Compiling the same code as C, produces a different result  (with -Os,see live on https://godbolt.org/):
.Ltext0:
        .globl  fun
        .type   fun, @function
fun:
...
        jmp     calc
The most notable difference: there is no code emitted for calc, so basically the linker will not able to link the executable, as the definition of calc is missing.
Obviously, inline means different things in C compared to C++.
What are differences for inline in C compared to C++? How the definition of calc should be done, that it can be used in a header in C and C++ at the same time?
 
    