Take the 2-minute tour ×
Stack Overflow is a question and answer site for professional and enthusiast programmers. It's 100% free, no registration required.

I am writing a couple of functions that I would like to inline.

Reading here and using the second c99 inline option with inline on all declarations and definitions, like so:

extern inline void SPFD54124B_write_cmd(uint16_t command);

in a header, and

inline void SPFD54124B_write_cmd(uint16_t command)
{
    spi_write(command, CMD_WIDTH);
}

in a corresponding c file. I was expecting to get inlined versions of the functions.

But when I compile i get:

Generating dependencies dep/spi.d from src/spi.c
Generating dependencies dep/spfd54124b.d from src/spfd54124b.c
Generating dependencies dep/pomodoro.d from src/pomodoro.c
Generating dependencies dep/font8x8_ualnum.d from src/font8x8_ualnum.c
Generating dependencies dep/font8x8_basic.d from src/font8x8_basic.c
Generating dependencies dep/evading_util.d from src/evading_util.c
Compiling src/evading_util.c
Compiling src/font8x8_basic.c
Compiling src/font8x8_ualnum.c
Compiling src/pomodoro.c
src/spfd54124b.h:96:20: warning: inline function 'SPFD54124B_write_pixel' declared but never defined [enabled by default]
src/spfd54124b.h:95:20: warning: inline function 'SPFD54124B_write_param' declared but never defined [enabled by default]
src/spfd54124b.h:94:20: warning: inline function 'SPFD54124B_write_cmd' declared but never defined [enabled by default]
src/spi.h:22:20: warning: inline function 'spi_write' declared but never defined [enabled by default]
src/spfd54124b.h:96:20: warning: inline function 'SPFD54124B_write_pixel' declared but never defined [enabled by default]
src/spfd54124b.h:95:20: warning: inline function 'SPFD54124B_write_param' declared but never defined [enabled by default]
src/spfd54124b.h:94:20: warning: inline function 'SPFD54124B_write_cmd' declared but never defined [enabled by default]
src/spi.h:22:20: warning: inline function 'spi_write' declared but never defined [enabled by default]
src/pomodoro.c: In function 'main':
src/spfd54124b.h:94:20: warning: inlining failed in call to 'SPFD54124B_write_cmd': function body not available [-Winline]
src/pomodoro.c:29:25: warning: called from here [-Winline]
src/spfd54124b.h:94:20: warning: inlining failed in call to 'SPFD54124B_write_cmd': function body not available [-Winline]
src/pomodoro.c:31:25: warning: called from here [-Winline]
src/spfd54124b.h:94:20: warning: inlining failed in call to 'SPFD54124B_write_cmd': function body not available [-Winline]
src/pomodoro.c:35:25: warning: called from here [-Winline]
src/spfd54124b.h:94:20: warning: inlining failed in call to 'SPFD54124B_write_cmd': function body not available [-Winline]
src/pomodoro.c:36:25: warning: called from here [-Winline]
src/spfd54124b.h:96:20: warning: inlining failed in call to 'SPFD54124B_write_pixel': function body not available [-Winline]
src/pomodoro.c:40:31: warning: called from here [-Winline]
src/spfd54124b.h:94:20: warning: inlining failed in call to 'SPFD54124B_write_cmd': function body not available [-Winline]
src/pomodoro.c:43:25: warning: called from here [-Winline]
Compiling src/spfd54124b.c
src/spi.h:22:20: warning: inline function 'spi_write' declared but never defined [enabled by default]
src/spi.h:22:20: warning: inline function 'spi_write' declared but never defined [enabled by default]
src/spfd54124b.c: In function 'SPFD54124B_init':
src/spi.h:22:20: warning: inlining failed in call to 'spi_write': function body not available [-Winline]
src/spfd54124b.c:124:14: warning: called from here [-Winline]
src/spi.h:22:20: warning: inlining failed in call to 'spi_write': function body not available [-Winline]
src/spfd54124b.c:129:14: warning: called from here [-Winline]
src/spi.h:22:20: warning: inlining failed in call to 'spi_write': function body not available [-Winline]
src/spfd54124b.c:124:14: warning: called from here [-Winline]
src/spi.h:22:20: warning: inlining failed in call to 'spi_write': function body not available [-Winline]
src/spfd54124b.c:129:14: warning: called from here [-Winline]
src/spfd54124b.c: In function 'SPFD54124B_read':
src/spi.h:22:20: warning: inlining failed in call to 'spi_write': function body not available [-Winline]
src/spfd54124b.c:25:14: warning: called from here [-Winline]
src/spi.h:22:20: warning: inlining failed in call to 'spi_write': function body not available [-Winline]
src/spfd54124b.c:29:14: warning: called from here [-Winline]
src/spfd54124b.c: In function 'SPFD54124B_write_cmd':
src/spi.h:22:20: warning: inlining failed in call to 'spi_write': function body not available [-Winline]
src/spfd54124b.c:124:14: warning: called from here [-Winline]
src/spfd54124b.c: In function 'SPFD54124B_write_param':
src/spi.h:22:20: warning: inlining failed in call to 'spi_write': function body not available [-Winline]
src/spfd54124b.c:129:14: warning: called from here [-Winline]
src/spfd54124b.c: In function 'SPFD54124B_write_pixel':
src/spi.h:22:20: warning: inlining failed in call to 'spi_write': function body not available [-Winline]
src/spfd54124b.c:129:14: warning: called from here [-Winline]
src/spi.h:22:20: warning: inlining failed in call to 'spi_write': function body not available [-Winline]
src/spfd54124b.c:129:14: warning: called from here [-Winline]
src/spfd54124b.c: In function 'SPFD54124B_setrow':
src/spi.h:22:20: warning: inlining failed in call to 'spi_write': function body not available [-Winline]
src/spfd54124b.c:124:14: warning: called from here [-Winline]
src/spi.h:22:20: warning: inlining failed in call to 'spi_write': function body not available [-Winline]
src/spfd54124b.c:129:14: warning: called from here [-Winline]
src/spi.h:22:20: warning: inlining failed in call to 'spi_write': function body not available [-Winline]
src/spfd54124b.c:129:14: warning: called from here [-Winline]
src/spi.h:22:20: warning: inlining failed in call to 'spi_write': function body not available [-Winline]
src/spfd54124b.c:129:14: warning: called from here [-Winline]
src/spi.h:22:20: warning: inlining failed in call to 'spi_write': function body not available [-Winline]
src/spfd54124b.c:129:14: warning: called from here [-Winline]
src/spfd54124b.c: In function 'SPFD54124B_setcol':
src/spi.h:22:20: warning: inlining failed in call to 'spi_write': function body not available [-Winline]
src/spfd54124b.c:124:14: warning: called from here [-Winline]
src/spi.h:22:20: warning: inlining failed in call to 'spi_write': function body not available [-Winline]
src/spfd54124b.c:129:14: warning: called from here [-Winline]
src/spi.h:22:20: warning: inlining failed in call to 'spi_write': function body not available [-Winline]
src/spfd54124b.c:129:14: warning: called from here [-Winline]
src/spi.h:22:20: warning: inlining failed in call to 'spi_write': function body not available [-Winline]
src/spfd54124b.c:129:14: warning: called from here [-Winline]
src/spi.h:22:20: warning: inlining failed in call to 'spi_write': function body not available [-Winline]
src/spfd54124b.c:129:14: warning: called from here [-Winline]
src/spfd54124b.c: In function 'SPFD54124B_lputch':
src/spi.h:22:20: warning: inlining failed in call to 'spi_write': function body not available [-Winline]
src/spfd54124b.c:124:14: warning: called from here [-Winline]
src/spi.h:22:20: warning: inlining failed in call to 'spi_write': function body not available [-Winline]
src/spfd54124b.c:129:14: warning: called from here [-Winline]
src/spi.h:22:20: warning: inlining failed in call to 'spi_write': function body not available [-Winline]
src/spfd54124b.c:129:14: warning: called from here [-Winline]
src/spi.h:22:20: warning: inlining failed in call to 'spi_write': function body not available [-Winline]
src/spfd54124b.c:129:14: warning: called from here [-Winline]
src/spi.h:22:20: warning: inlining failed in call to 'spi_write': function body not available [-Winline]
src/spfd54124b.c:129:14: warning: called from here [-Winline]
src/spfd54124b.c: In function 'SPFD54124B_putch':
src/spi.h:22:20: warning: inlining failed in call to 'spi_write': function body not available [-Winline]
src/spfd54124b.c:124:14: warning: called from here [-Winline]
src/spi.h:22:20: warning: inlining failed in call to 'spi_write': function body not available [-Winline]
src/spfd54124b.c:129:14: warning: called from here [-Winline]
src/spi.h:22:20: warning: inlining failed in call to 'spi_write': function body not available [-Winline]
src/spfd54124b.c:129:14: warning: called from here [-Winline]
src/spi.h:22:20: warning: inlining failed in call to 'spi_write': function body not available [-Winline]
src/spfd54124b.c:129:14: warning: called from here [-Winline]
src/spi.h:22:20: warning: inlining failed in call to 'spi_write': function body not available [-Winline]
src/spfd54124b.c:129:14: warning: called from here [-Winline]
Compiling src/spi.c
Linking bin/pomodoro.elf

>>>> Size of Firmware <<<<
   text    data     bss     dec     hex filename
   3150       0       2    3152     c50 bin/pomodoro.elf

src/spfd54124b.h:96:20: warning: inline function 'SPFD54124B_write_pixel' declared but never defined [enabled by default]
src/spfd54124b.h:95:20: warning: inline function 'SPFD54124B_write_param' declared but never defined [enabled by default]
src/spfd54124b.h:94:20: warning: inline function 'SPFD54124B_write_cmd' declared but never defined [enabled by default]
src/spi.h:22:20: warning: inline function 'spi_write' declared but never defined [enabled by default]
src/spfd54124b.h:96:20: warning: inline function 'SPFD54124B_write_pixel' declared but never defined [enabled by default]
src/spfd54124b.h:95:20: warning: inline function 'SPFD54124B_write_param' declared but never defined [enabled by default]
src/spfd54124b.h:94:20: warning: inline function 'SPFD54124B_write_cmd' declared but never defined [enabled by default]
src/spi.h:22:20: warning: inline function 'spi_write' declared but never defined [enabled by default]
src/pomodoro.c: In function 'main':
src/spfd54124b.h:94:20: warning: inlining failed in call to 'SPFD54124B_write_cmd': function body not available [-Winline]
src/pomodoro.c:29:25: warning: called from here [-Winline]
src/spfd54124b.h:94:20: warning: inlining failed in call to 'SPFD54124B_write_cmd': function body not available [-Winline]
src/pomodoro.c:31:25: warning: called from here [-Winline]
src/spfd54124b.h:94:20: warning: inlining failed in call to 'SPFD54124B_write_cmd': function body not available [-Winline]
src/pomodoro.c:35:25: warning: called from here [-Winline]
src/spfd54124b.h:94:20: warning: inlining failed in call to 'SPFD54124B_write_cmd': function body not available [-Winline]
src/pomodoro.c:36:25: warning: called from here [-Winline]
src/spfd54124b.h:96:20: warning: inlining failed in call to 'SPFD54124B_write_pixel': function body not available [-Winline]
src/pomodoro.c:40:31: warning: called from here [-Winline]
src/spfd54124b.h:94:20: warning: inlining failed in call to 'SPFD54124B_write_cmd': function body not available [-Winline]
src/pomodoro.c:43:25: warning: called from here [-Winline]

I'm not sure I understand the different inlining alternatives in c99.

share|improve this question
2  
You have different function names, one is ...123B... and the other ...124B.... Fix that and see what problems remain. –  Daniel Fischer Jun 23 '13 at 22:59
    
@DanielFischer Oo nice catch –  Steven Huang Jun 23 '13 at 22:59
    
Well f... me... Why do I allways do that? But fixing it still gives me alot of src/spfd54124b.h:94:20: warning: inline function 'SPFD54124B_write_cmd' declared but never defined [enabled by default] –  evading Jun 23 '13 at 23:00
    
Does it compile and run? –  Max E. Jun 23 '13 at 23:03
    
It compiles and produces a hex that runs just as expected. –  evading Jun 23 '13 at 23:05

2 Answers 2

up vote 3 down vote accepted

You have things exactly the wrong way around from the way you need them. In the header, you should use:

inline void SPFD54124B_write_cmd(uint16_t command)
{
    spi_write(command, CMD_WIDTH);
}

In the translation units that include this header, this will create an inline function with external linkage. In exactly one of these translation units you should also place the declaration:

extern void SPFD54124B_write_cmd(uint16_t);

This (together with the inline definition from the header) will create an external definition of the function. The other files that include the header but do not include the extern declaration will create an inline definition of the function: a definition only available in that translation unit, but that does not forbid an external definition elsewhere.

In total you will have one external definition of the function, and each file that includes the header will also have a non-external definition available; the compiler can use either. Conceptually there is still just one function called SPFD54124B_write_cmd in the complete program - for example if you take the address of the function in multiple translation units you should get the same value.

As an alternative, you can put this in the header:

static inline void SPFD54124B_write_cmd(uint16_t command)
{
    spi_write(command, CMD_WIDTH);
}

and use no extern declaration at all; this will create an inline function with internal linkage in each file that includes the header. There will be no external definition of the function at all, and conceptually each translation unit that includes the header has its own independent copy of the function.


(It should be noted for posterity that GCC's current default mode is "gnu89", which does not implement C99 semantics for inline)

share|improve this answer
    
Hmmm... I'm using -std=c99 and -Winline and now I have void SPFD54124B_write_cmd(uint16_t command); in header spdf54124b.h and a definition inline void SPFD54124B_write_cmd(uint16_t command) {...} in spdf54124b.c and then I just include spdf54124b.h from everywhere I need the function. I get no warnings about not inlining. This is proving to be a lot harder than I thought it would =) –  evading Jun 24 '13 at 9:44
    
Looking at the assembly I saw that before following this advice the functions was not always inlined, even if i did not get a warning. Having the definition in the header and so on made the binary MUCH larger and the speed MUCH faster, on my MSP430G uc. So this is what I was looking for. –  evading Jun 24 '13 at 22:24

To ensure that a function ACTUALLY can be inlined, it pretty much has to be defined in the header-file.

When you don't do that, most compilers won't actually inline the function.

So my suggestion would be to move the actual function content into the header file:

inline void SPFD54124B_write_cmd(uint16_t command)
{
    spi_write(command, CMD_WIDTH);
}
share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.