A while back I wrote an article on using inline templates. It's a bit of a niche article as I would generally advise people to write in C/C++, and tune the compiler flags and source code until the compiler generates the code that they want to see.
However, one thing that I didn't mention in the article, it's implied but not stated, is that inline templates are defined as C functions. When used from C++ they need to be declared as extern "C", otherwise you get linker errors. Here's an example template:
.inline nothing
nop
.end
And here's some code that calls it:
void nothing();
int main()
{
nothing();
}
The code works when compiled as C, but not as C++:
$ cc i.c i.il
$ ./a.out
$ CC i.c i.il
Undefined first referenced
symbol in file
void nothing() i.o
ld: fatal: Symbol referencing errors. No output written to a.out
To fix this, and make the code compilable with both C and C++ we use the __cplusplus
feature test macro and conditionally include extern "C"
. Here's the modified source:
#ifdef __cplusplus
extern "C"
{
#endif
void nothing();
#ifdef __cplusplus
}
#endif
int main()
{
nothing();
}