2013-06-23 3 views
4

Я пишу пару функций, которые я хотел бы встроить.c99 встроенная семантика с gcc (mspgcc)

Чтение here и используя второй C99 встроенный вариант с инлайн всех деклараций и определений, например, так:

extern inline void SPFD54124B_write_cmd(uint16_t command); 

в заголовке, и

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

в соответствующем файле гр. Я ожидал получить встроенные версии функций.

Но когда я компилирую я получаю:

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] 

Я не уверен, я понимаю, различные варианты встраивания в c99.

+2

У вас есть различные названия функций, один '... 123B ... 'и другой' ... 124B ... '. Исправьте это и посмотрите, какие проблемы остаются. –

+0

@ DanielFischer Oo nice catch –

+0

Ну что ж ... меня ... Почему я всегда так делаю? Но исправление этого по-прежнему дает мне много «src/spfd54124b.h: 94: 20: warning: встроенная функция« SPFD54124B_write_cmd »объявлена, но никогда не определена [включена по умолчанию]' – evading

ответ

6

У вас есть вещи точно неправильный путь вокруг от того, как вы нуждаетесь в них. В заголовке, вы должны использовать:

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

В единицах трансляции, которые включают этот заголовок, это создаст инлайн функции с внешним связыванием. Точно один этих единиц перевода следует также поместить объявление:

extern void SPFD54124B_write_cmd(uint16_t); 

это (вместе с inline определения из заголовка) создаст внешнее определение функции. Другие файлы, которые включают заголовок, но не включают объявление extern, создадут встроенное определение функции: определение доступно только в этой единицы перевода, но это не запрещает внешнее определение в другом месте.

Всего вы получите одно внешнее определение функции, и каждый файл, содержащий заголовок, также будет иметь внешнее определение; компилятор может использовать либо. Концептуально в полной программе есть только одна функция, называемая SPFD54124B_write_cmd - например, если вы берете адрес функции в нескольких единицах перевода, вы должны получить одинаковое значение.

В качестве альтернативы, вы можете поместить это в заголовке:

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

и не используете extern деклараций на всех; это создаст встроенную функцию с внутренней связью в каждом файле, который включает заголовок. Внешнего определения функции вообще не будет, и концептуально каждая единица перевода, которая включает заголовок, имеет свою независимую копию функции.


(Следует отметить, что для потомков текущего режима GCC по умолчанию является «gnu89», который делает не реализовать C99 семантику inline)

+0

Хммм ... Я использую '-std = c99' и' -Winline', и теперь у меня есть 'void SPFD54124B_write_cmd (команда uint16_t);' в заголовке spdf54124b.h и определение 'inline void SPFD54124B_write_cmd (команда uint16_t) { ...} 'в spdf54124b.c, а затем я просто включаю spdf54124b.h от везде мне нужна функция. Я не вижу никаких предупреждений о том, что вы не вникнете. Это оказалось намного сложнее, чем я думал, что это будет =) – evading

+0

Глядя на сборку, я увидел, что перед тем, как следовать этому совету, функции не всегда были встроены, даже если я не получил предупреждения. Наличие определения в заголовке и т. Д. Сделало двоичный MUCH большим и скорость МНОГО быстрее, на моем MSP430G uc. Так вот что я искал. – evading

3

Чтобы гарантировать, что функция ACTUALLY может быть встроена, ее довольно многое должно быть определено в заголовочном файле.

Если вы этого не сделаете, большинство компиляторов фактически не включит функцию.

Так что мое предложение было бы переместить фактическое содержание функции в файл заголовок:

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