I have gone through some posts related to this topic but was not able to sort out my doubt completely. This might be a very naive question.
I have a header file inline.h
and two translation units main.cpp
and tran.cpp
.
Details of code are as below
inline.h
#ifndef __HEADER__
#include <stdio.h>
extern inline int func1(void)
{ return 5; }
static inline int func2(void)
{ return 6; }
inline int func3(void)
{ return 7; }
#endif
main.c
#define <stdio.h>
#include <inline.h>
int main(int argc, char *argv[])
{
printf("%d\n",func1());
printf("%d\n",func2());
printf("%d\n",func3());
return 0;
}
tran.cpp
//(note that the functions are not inline here)
#include <stdio.h>
int func1(void)
{ return 500; }
int func2(void)
{ return 600; }
int func3(void)
{ return 700; }
The above code compiles in g++, but does not compile in gcc (even if you make changes related to gcc like changing the code to .c, not using any C++ header files, etc.). The error displayed is "duplicate definition of inline function - func3".
Can you clarify why this difference is present across compilers?
Also, when you run the program (g++ compiled) by creating two separate compilation units (main.o
and tran.o
) and create an executable a.out
, the output obtained is:
500
6
700
Why does the compiler pick up the definition of the function which is not inline. Actually, since #include
is used to "add" the inline definition I had expected 5,6,7
as the output. My understanding was during compilation since the inline definition is found, the function call would be "replaced" by inline function definition.
Can you please tell me in detailed steps the process of compilation and linking which would lead us to 500,6,700
output. I can only understand the output 6.
inline
in C99 is different from the legacy GCC-specific extension. Which specification are you trying to use? – AnT#ifndef __HEADER__
(preprocessor) identifiers beginning with one or more underscores are reserved for the language ore implementation. 2) which language, C or C++? – wildplasser#define __HEADER__
. Also, here is a link (in my opinion it might be helpful): greenend.org.uk/rjk/tech/inline.html – smbear